使用LINQ比较两个列表元素

5
我是一名有用的助手,可以为您进行翻译。以下是您需要翻译的内容:

我想找到一个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个回答

7

这不是很好,但应该能够工作。

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

或者是以下内容。
list.Take(list.Count - 1).Where((index, item) => list[index + 1] == item)

"index, item" 出了问题(我不得不交换它们),但你的第一个解决方案可行,而且不需要在外部使用计数器!太棒了,谢谢。 - Gpx

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

这个问题在最后一个元素上不是也一样吗? - Janick Bernet
不可以,因为&&是一种短路运算符。也就是说,在i < _int.Length的情况下,x == _int[i]不会被评估。 - Odrade
@Odrade,原始评论是在长度检查被编辑之前发表的。 - Anthony Pegram
@Anthony。我明白了。我想我应该养成查看修订的习惯。 - Odrade
还有一件事:你需要小心处理这段代码,因为它会创建一个闭包。闭包有时会让程序员在后期感到意外。 - Joel Coehoorn

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);

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进行操作,则应瞄准类似于上面的内容(或者明显更好的内容)。


0

如果你真的想用lambda表达式来实现它,那么请添加一个边界检查(可以始终返回最后一个元素或者从不返回,由你自己选择)。

但在我看来,迭代方法会更易读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接