Linq:一行X个对象
本文关键字:对象 一行 Linq | 更新日期: 2023-09-27 18:11:35
我需要一个linq查询的帮助,如果列表按日期排序时一行中包含x个对象,则该查询将返回true。
so like this:
myList.InARow(x => x.Correct, 3)
如果一行中有3个属性为正确== true, 将返回true。
不知道怎么做
使用GroupAdjacent
扩展,您可以:
var hasThreeConsecutiveCorrect
= myList.GroupAdjacent(item => item.Correct)
.Any(group => group.Key && group.Count() >= 3);
下面是Rollup
扩展的另一种方式(介于Select和Aggregate之间),它在某种程度上更节省空间:
var hasThreeConsecutiveCorrect
= myList.Rollup(0, (item, sum) => item.Correct ? (sum + 1) : 0)
.Contains(3);
linq中没有任何东西可以轻松处理这种情况。但是创建自己的扩展方法是一件相对简单的事情。
public static class EnumerableExtensions {
public IEnumerable<T> InARow<T>(this IEnumerable<T> list,
Predicate<T> filter, int length) {
int run = 0;
foreach (T element in list) {
if (filter(element)) {
if (++run >= length) return true;
}
else {
run = 0;
}
}
return false;
}
}
已更新:
myList.Aggregate(0,
(result, x) => (result >= 3) ? result : (x.Correct ? result + 1 : 0),
result => result >= 3);
广义版本:
myList.Aggregate(0,
(result, x) => (result >= length) ? result : (filter(x) ? result + 1 : 0),
result => result >= length);