2012-04-13 28 views
5

iLINQ Dizinde çalışıyor mu?

byte[] myarr = {1,4,3,4,1,2,1,2,4,3,1,4,2};  

myarr da int [] val uzunluğu olacaktır uzunluğu 13 (0-12 Endeksi) olacaktır bir dizi var düşünelim.

int[] val = new int[13]; 

Değerinin 4 olduğu, yani 1,3,8,11 olduğu myarr dizinini kontrol etmek istiyorum.

Sonra ben bunu yapmanın

val[1]++; 
val[3]++; 
val[8]++; 
val[11]++; 

bir yolu döngü için kullandığı istiyorum

for(int i=0; i<myarr.length; i++) 
{ 
    if(myarr[i] == 4) 
     val[i]++; 
} 

Biz Array.indexOf kullanabilirsiniz ama değer zorunda anlamına bu değerin ilk dizini döndürür Eşsiz ol ve myarr'ımın birçok değeri var.

Bu, linq kullanılarak yapılabilir mi? Nihayet ben sorunuzu anladım;) yapabilirsiniz

myarr.Select((i, index) => new { Index = index, Value = i }) 
       .Where(x => x.Value == 4) 
       .Select(x => x.Index) 
       .ForEach(i => myarr[i]++); 
+5

Neden LINQ ile ilgilenirsiniz? Örnek çalışıyorsun, gayet basit. Ayrıca, LINQ'dan alabileceğin en iyi şeyin gerçek değer olacağını düşünüyorum ... o zaman hala onu arttırmak ve diziye geri vermek zorundasın. – musefan

+1

LINQ'daki 'Q' Query için duruyor. LINQ * sorgulama * verileri için kullanılır. * Verileri * değiştirmek istersiniz. For döngüsünüz bunu yapmanın yoludur. –

+1

@GrahamClark: LINC için olası bir fikir mi? .... kim var? – musefan

cevap

3

.

+0

"ForEach (i => val [i] ++) olmalıdır" diyorum. –

+0

@PetrAbdulin doğru, kod örneğini düzelttim. Teşekkürler! – GolfWolf

+0

@ w0lf: İki yerde -1 koşulu nedir? –

1

Sen index saklamak için bir anonymous type kullanabilirsiniz daha basit. LINQ yalnızca sorgu bölümü ile size yardımcı olacaktır, güncelleme kısmı bir foo döngüsünde yapılmalıdır, ancak dizi değer türlerini içerdiğinden, LINQ-sorgudan indeksler almanız gerekir ve gerçek değerleri değil ve hiçbir şey kazanmadınız.

myarr.Select((b, i) => b == 4 ? i : -1) 
    .Where(i => i != -1) 
    .ToList().ForEach(i => val[i]++); 

Kişisel olmayan LINQ sürümü açıkçası çok daha özlü ve okunabilir, bu yüzden bunu kullanmak gerektiğini düşünüyorum: Bu benim (güncelleme dahil) LINQ yaptığını sona erdi budur

+1

'Artış' kısmı nerede? –

+0

@ L.B: Sadece bu kısmı okudum, düzeltildi. –

+0

Varolan 'val' değiştirerek yerine yeni bir dizi oluşturur. –

2

ama olmayacak:

int[] newIndices = myarr.Select((i, index) => new { Index = index, Value = i }) 
      .Where (x => x.Value == 4) 
      .Select(x => x.Index + 1) 
      .ToArray(); 

Edit:

İlgili konular