3

我正在尝试将此 foreach 循环移动到 linq:

compData = componentData[0];
foreach (var componentTraceData in componentData)
{
     if (!string.IsNullOrEmpty(componentTraceData.CompName))
     {
          compData = componentTraceData;
          break;
     }
}

这就是我尝试过的:

var tt = (from n in componentData 
          where !string.IsNullOrEmpty(n.CompName) 
          select n).FirstOrDefault();

componentData[0]如果 linq 没有找到任何结果,我该如何处理?

4

3 回答 3

11

取您当前拥有的行并?? componentData[0]在最后添加。

??是空合并运算符。它只是简写,“如果我左边的为空,返回我右边的。如果它不为空,返回那个。”

于 2012-07-11T14:36:21.633 回答
6

您可以使用Enumerable.DefaultIfEmpty并指定自定义默认值:

var result = componentData.Where(n => !string.IsNullOrEmpty(n.CompName))
                          .DefaultIfEmpty(componentData.ElementAtOrDefault(0))
                          .First();

请注意,您现在可以First安全地使用,因为序列不能再为空。如果源序列为空,ElementAtOrDefault将返回(引用类型为 null)。default(T)当您直接使用 an 的索引器时,这将防止异常IList<T>

于 2012-07-11T14:41:45.913 回答
2
var tt = componentData.FirstOrDefault(n=!string.IsNullOrEmpty(n.CompName)) ?? componentData[0];

尽管您也想首先检查它componentData是否不为空并且count/length是否大于零。

于 2012-07-11T14:39:28.060 回答