是否有 LINQ 扩展或(一组合理/高效的 LINQ 扩展)来确定集合是否至少具有“x”个元素?

2024-03-27

我的代码需要知道集合不应为空或仅包含一项。

一般来说,我想要形式的扩展:

bool collectionHasAtLeast2Items = collection.AtLeast(2);

我可以轻松编写扩展,枚举集合并递增索引器,直到达到请求的大小或用完元素,但是 LINQ 框架中是否已有某些功能可以执行此操作?我的想法(按我想到的顺序)是:

bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2; or

bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;

尽管未定义获取比集合包含的元素更多的元素的行为(在文档中),但这似乎可行可枚举.Take 方法 http://msdn.microsoft.com/en-us/library/bb503062.aspx然而,它似乎正如人们所期望的那样。

这不是最有效的解决方案,要么枚举一次以获取元素,然后再次枚举以对它们进行计数,这是不必要的,或者枚举一次以获取元素,然后构造一个列表以获取不是枚举器的 count 属性-y,因为我实际上并不想要该列表。

这并不漂亮,因为我总是必须做出两个断言,首先采用“x”,然后检查我是否确实收到了“x”,并且这取决于未记录的行为。

或者也许我可以使用:

bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;

然而,这在语义上并不清晰。也许最好的方法是用一个代表我想要的方法名称来包装它。我假设这将是有效的,我还没有反映在代码上。

其他一些想法正在使用Last(),但我明确不想枚举整个集合。

或者可能Skip(2).Any(),同样在语义上并不完全明显,但比ElementAtOrDefault(2) != null,尽管我认为它们会产生相同的结果?

有什么想法吗?


public static bool AtLeast<T>(this IEnumerable<T> source, int count)
{
    // Optimization for ICollection<T>
    var genericCollection = source as ICollection<T>;
    if (genericCollection != null)
        return genericCollection.Count >= count;

    // Optimization for ICollection
    var collection = source as ICollection;
    if (collection != null)
        return collection.Count >= count;

    // General case
    using (var en = source.GetEnumerator())
    {
        int n = 0;
        while (n < count && en.MoveNext()) n++;
        return n == count;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有 LINQ 扩展或(一组合理/高效的 LINQ 扩展)来确定集合是否至少具有“x”个元素? 的相关文章

随机推荐