2012-07-11 84 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大於零一太。

相關問題