Linq的FirstOrDefault

Nig*_*ker 3 c# linq

我试图将这个foreach循环移动到linq:

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

这就是我试过的:

var tt = (from n in componentData 
          where !string.IsNullOrEmpty(n.CompName) 
          select n).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

componentData[0]如果linq没有找到任何结果我怎么能接受?

Ser*_*rvy 11

拿走你现有的那一行并?? componentData[0]在最后添加.

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


Tim*_*ter 6

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

var result = componentData.Where(n => !string.IsNullOrEmpty(n.CompName))
                          .DefaultIfEmpty(componentData.ElementAtOrDefault(0))
                          .First();
Run Code Online (Sandbox Code Playgroud)

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