我试图找到一个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