我試圖找到一個LINQ表達式來比較兩個列表元素。比較兩個列表元素與LINQ
我想要做的是:
List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5};
_int.Where(x => x == _int[(_int.IndexOf(x)) + 1]);
遺憾的是,只有最後+1
跳出列表的範圍。
如何在LINQ表達式中將一個項目與下一個項目進行比較?
我試圖找到一個LINQ表達式來比較兩個列表元素。比較兩個列表元素與LINQ
我想要做的是:
List<int> _int = new List<int> { 1, 2, 3, 3, 4, 5};
_int.Where(x => x == _int[(_int.IndexOf(x)) + 1]);
遺憾的是,只有最後+1
跳出列表的範圍。
如何在LINQ表達式中將一個項目與下一個項目進行比較?
不是很好,但應該工作。
list.Where((index, item) => index < list.Count - 1 && list[index + 1] == item)
或以下。
list.Take(list.Count - 1).Where((index, item) => list[index + 1] == item)
int i = 0;
_int.Where(x =>
{
i++;
return i < _int.Length && x == _int[i];
});
這與最後一個元素沒有相同的問題嗎? – 2010-06-23 14:49:24
不,因爲&&是一個短路操作員。也就是說,當我<_int.Length,x == _int [i]不會被評估。 – Odrade 2010-06-23 14:56:12
@Odrade,原始評論是在對照長度的檢查之前編輯的。 – 2010-06-23 14:59:21
如果你真的想用lambda表達式來做,請添加一個綁定檢查(要麼總是返回最後一個元素,要麼永遠不會返回你的選擇)。
但是,IMO的迭代方法更具可讀性。
這是一個有趣的問題,我也許會去查詢表達式語法在那裏可以這樣
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;
這會從數組(或列表)中提取3來完成。當然,在查詢表達式中可以做什麼顯然可以在lambda中完成。
編輯 Joel的解決方案比我的要簡單得多,如果你只是需要它在List或數組上工作,那就完美了。如果你需要更靈活的東西來對付任何IEnumerable,那麼你會瞄準上面的東西(或者更好的東西)。
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);
「索引,項目」出錯了(我必須切換它們),但是您的第一個解決方案可以正常工作,並且不需要外部櫃檯!萬分感謝。 – Gpx 2010-06-23 15:28:08