Linq的FirstOrDefault

时间:2012-07-11 14:34:52

标签: c# linq

我试图将这个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();

如果linq没有找到任何结果,我如何能够componentData[0]

3 个答案:

答案 0 :(得分:11)

选择您当前拥有的行,并在结尾处添加?? componentData[0]

??是空合并运算符。这只是简写,“如果我左边的内容为null,则返回我右边的内容。如果它不为null,则返回。”

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

var tt = componentData.FirstOrDefault(n=!string.IsNullOrEmpty(n.CompName)) ?? componentData[0];

虽然您希望检查componentData是否为空,count / length也是大于零。