Linq:一行X个对象

本文关键字:对象 一行 Linq | 更新日期: 2023-09-27 18:11:35

我需要一个linq查询的帮助,如果列表按日期排序时一行中包含x个对象,则该查询将返回true。

so like this:

myList.InARow(x => x.Correct, 3)
如果一行中有3个属性为正确== true,

将返回true。

不知道怎么做

Linq:一行X个对象

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