2010-06-23 21 views
5

ile karşılaştırın İki liste öğesini karşılaştırmak için bir LINQ ifadesi bulmaya çalışıyorum.İki liste öğesini LINQ

Ne yapmak istediğim geçerli:

List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5}; 
_int.Where(x => x == _int[(_int.IndexOf(x)) + 1]); 

Maalesef sadece son +1 listenin aralık dışında atlar.

Listede bir sonraki ile bir öğeyi LINQ ifadesinde nasıl karşılaştırabilirim?

cevap

6

Bu hoş değil ama işe yaramalı. Ya da aşağıdaki gibi.

list.Take(list.Count - 1).Where((index, item) => list[index + 1] == item) 
+0

Bir şey "dizin, öğe" (ben onları değiştirmek zorunda kaldım) ile yanlış gitti ama ilk çözüm çalışıyor ve dışarıda bir sayaç için gerek yok! Çok teşekkürler. – Gpx

4
int i = 0; 
_int.Where(x => 
{ 
    i++; 
    return i < _int.Length && x == _int[i]; 
}); 
+0

Bu son öğe ile aynı sorun değil mi? –

+0

Hayır, çünkü && kısa devre yapan bir operatördür. Yani, <_int.Length, x == _int [i] değerlendirilmeyecek. – Odrade

+0

@Odrade, orijinal yorum, uzunluğun düzeltilmesine karşı kontrol edilmeden önce. –

0

Eğer gerçekten bir lambda ifadesi ile bunu bir sınır kontrol eklemek istiyorsanız (ya hep son öğe döndüren veya asla, tercih). IMO ile yinelemeli bir yaklaşım daha okunaklı olabilirdi.

1

Bu ilginç Sorun değil, belki de dizi (veya listesi) dan 3 ayıklamak istiyorum bu

int[] array = {1,2,3,3,4,5}; 
var query = from item in array.Select((val, index) => new { val, index }) 
      join nextItem in array.Select((val, index) => new { val, index }) 
      on item.index equals (nextItem.index + 1) 
      where item.val == nextItem.val 
      select item.val; 

gibi yapılabilir sorgu ifadesi sözdizimi için gider. Tabii ki, sorgu ifadesinde ne yapılabilir ki açıkça lambda yapılabilir.

Edit Joel'in çözümü benimkinden çok daha basittir ve bir Listede veya bir dizide çalışmak için ihtiyacınız varsa mükemmeldir. Herhangi bir IEnumerable karşı çalışmak için daha esnek bir şeye ihtiyacınız varsa, o zaman yukarıdaki gibi bir şey (ya da belli ki daha iyi bir şey) hedeflersiniz.

2
List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5 }; 
Enumerable.Range(0, _int.Count - 1) 
    .Select(i => new {val = _int[i], val2 = _int[i + 1]}) 
    .Where(check => check.val == check.val2) 
    .Select(check => check.val);