【问题标题】:Checking if no elements in IEnumerable(Of T) - Linq element and quantifier operators检查 IEnumerable(Of T) 中是否没有元素 - Linq 元素和量词运算符
【发布时间】:2009-05-28 04:08:59
【问题描述】:

为了我的功能

IEnumerable<CallbackListRecord> LoadOpenListToProcess(CallbackSearchParams usp);

当序列不包含任何元素(应该如此)时,此行会出错

CallbackListRecord nextRecord = CallbackSearch.LoadOpenListToProcess(p).First();

我已经改成下面这个了

CallbackListRecord nextRecord = null;
IEnumerable<CallbackListRecord> nextRecords = CallbackSearch.LoadOpenListToProcess(p);
if (nextRecords.Any())
{
    nextRecord = nextRecords.First();
}

是否有更好、更简单或更优雅的方法来确定 IEnumerable 序列是否没有元素?

【问题讨论】:

    标签: c# linq ienumerable element


    【解决方案1】:

    您应该尽量避免枚举它不必要的次数(即使是短路的,例如 FirstAny) - 怎么样:

    var nextRecord = CallbackSearch.LoadOpenListToProcess(p).FirstOrDefault();
    if(nextRecord != null) {
        // process it...
    }
    

    这适用于类(因为您可以将引用与 null 进行比较)。

    【讨论】:

    • 在这种情况下使用 var 关键字有什么具体原因吗?
    • @boon - 嗯,它更短...不,使用 var 始终等同于编译器将 var 解析为的类型(在这种情况下为 CallbackListRecord)。
    • @boon - 一个非常简单的原因;没有它,文本会滚动到页面外;-p
    【解决方案2】:

    您可以将代码缩短为以下内容

    var nextrecord = CallbackSearch.LoadOpenListToProcess(p).FirstOrDefault();
    

    nextrecord 将包含 First 元素(如果有一个元素)或 null 如果集合为空。

    【讨论】:

      【解决方案3】:

      如果您预计序列中可能有空值,您可以自己处理枚举数。

      var enumerator = CallbackSearch.LoadOpenListToProcess(p).GetEnumerator();
      if (enumerator.MoveNext()) {
        var item = enumerator.Current;
        ...
      }
      

      【讨论】:

        【解决方案4】:

        你可以像这样添加一个扩展方法:

        public static class Extensions
        {
            public static bool HasElements<T>(this IEnumerable<T> collection)
            {
                foreach (T t in collection)
                    return true;
        
                return false;
            }
        }
        

        【讨论】:

        • FirstOrDefault 更好,因为您至少会获得第一条记录的实例
        • FirstOrDefault 如果您枚举结构而不是类,如果您检查 null 以查看是否有任何元素,则会出现问题。但是,是的,如果您考虑到这一点,它会更快。
        • 但是你不会检查空值。在 IEnumerable 的情况下,您会说“if (nextRecord == default(int))”,尽管当集合中可能存在零时,这可能是不明确的。在这种情况下,最好调用 ToArray() 或 ToList() 并检查其长度,然后按索引获取第一项。
        猜你喜欢
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        相关资源
        最近更新 更多