4

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

像这样:

myList.InARow(x => x.Correct, 3)

如果连续有 3 个属性正确 == true,则返回 true。

不知道该怎么做。

4

3 回答 3

8

使用GroupAdjacent扩展程序,您可以执行以下操作:

var hasThreeConsecutiveCorrect 
    = myList.GroupAdjacent(item => item.Correct)
            .Any(group => group.Key && group.Count() >= 3);

这是另一种Rollup更节省空间的扩展方式(选择和聚合之间的交叉):

var hasThreeConsecutiveCorrect 
    = myList.Rollup(0, (item, sum) => item.Correct ? (sum + 1) : 0)
            .Contains(3);
于 2013-04-29T15:59:43.687 回答
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;
    }
}
于 2013-04-29T16:05:37.273 回答
2

更新

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);
于 2013-04-29T16:16:44.393 回答