2012-07-11 58 views
3

我想这个foreach循环移动到LINQ:FirstOrDefault 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不发现任何结果?

+2

[FirstOrDefault返回null时,返回列表中的第一项可能重复](http://stackoverflow.com/questions/9429341/return-first-item-in-list-if-firstordefault-returns-null) – 2012-07-11 14:37:20

回答

6

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

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

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

11

带你目前拥有的线,并在末尾添加?? componentData[0]

??是空合并运算符。这只是为速记,“如果有什么我左边为空,则返回什么是我的权利。如果它不为空,返回。”

+0

[对于引用类型,“default(t)'](http://msdn.microsoft.com/zh-cn/library/xwth0h0d%28v=vs.80%29.aspx)仅为空。 – 2012-07-11 15:10:09

+1

@TimSchmelter真的,但我非常怀疑他在这里使用一个结构。你是正确的,但它不尽然。 – Servy 2012-07-11 15:15:50

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

尽管你想检查componentData是不是null,count/length大于零一太。

相关问题