使用LINQ比较两个列表元素

时间:2010-06-23 14:43:32

标签: c# .net 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表达式中将一个项目与列表中的下一个项目进行比较?

5 个答案:

答案 0 :(得分:6)

不是很好,但应该有效。

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

或以下。

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

答案 1 :(得分:4)

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

答案 2 :(得分: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);

答案 3 :(得分:1)

这是一个有趣的问题,我可能会选择查询表达式语法,可以这样做

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,那么你就会瞄准上面的东西(或明显更好的东西)。

答案 4 :(得分:0)

如果你真的想用lambda表达式做,请添加一个绑定检查(要么总是返回最后一个元素,要么永远不会,你的选择)。

尽管如此,迭代方法会更具可读性。