2012-01-10 24 views
8

首先,我是LINQ的noob! 然後,事情是,我有一個集合:在LINQ中混合Any()和First()?

  1. 要麼不包含我的ID(字符串)
  2. 或含有它只有一次

我想用在哪裏,但我不喜歡它的if指令,我必須這樣做......所以這裏是我的代碼:

if (MyCollection.Any(rm => rm.BaseName == rbName)) 
{ 
    var tmp = MyCollection.First(rm => rm.BaseName == rbName); 
} 

這工作,但我真的覺得這不是我應該做的方式與LINQ ... 任何建議?

+0

您應該檢查'FirstOrDefault' – V4Vendetta 2012-01-10 09:14:25

+0

爲什麼不使用FirstOrDefault(),並且在查詢後檢查結果是否爲空或它包含數據? – BigL 2012-01-10 09:14:33

+0

不知道這個方法:(我更喜歡SingleOrDefault! – 2012-01-10 09:18:44

回答

16

非唯一實體回答(與多個實例異常拋出)

使用SingleOrDefault。這將返回唯一項,如果它存在,則返回null;如果它不存在,則返回該唯一項;否則如果有多個項,則拋出異常。

var tmp = MyCollection.SingleOrDefault(rm => rm.BaseName == rbName); 

獨特的屬性答案(永遠不會有多個實例)

如果您的系統設置,以便BaseName是一個獨特的實體,用戶FirstOrDefault,這不會,如果拋出異常有是多重的,因爲它會在第一時間停止,但系統將被設計成不會有相同的實例,所以它是可以接受的(並且時間減少)。

var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
+0

這真的很不錯!異常處理是非常好的:) – 2012-01-10 09:19:02

+1

這是很好的方式,如果有過匹配,那麼它會拋出一個異常,但如果你的系統設置爲不可能重複,那麼該例外永遠不需要,那麼使用FirstOrDefault(僅當它是主鍵或在插入時設置了驗證)。 – ThePower 2012-01-10 09:22:17

5
var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName)); 

這裏TMP將是無效的,如果你沒有這樣的記錄。

1

Any回到bool來表示,如果這樣的項目存在,First從集合返回的記錄。所以在任何情況下,你都會有收集對象和你的情況結果。您可以使用FirstOrDefault,然後檢查您的返回值null

var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
if (tmp != null) 
{ 
    // do something 
} 
2

您可以使用,

FirstOrDefault() 

SingleOrDefault() 
1
var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
if (tmp != null) 
{ 
    // Do something 
} 
12

由於ThePower說,你應該使用SingleOrDefault或者是FirstOrDefault。如果真的只有一個這樣的條目,他們會做同樣的事情,但FirstOrDefault可能會更快,如果您使用LINQ to Objects - SingleOrDefault將不得不掃描整個序列以檢查沒有任何其他匹配。

如果有多個匹配,SingleOrDefault會拋出異常; FirstOrDefault只會返回第一個匹配項。

所以,你可以使用:

var result = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
if (result != null) 
{ 
    // Use it 
} 

注意,這可能是尷尬的,如果你的序列元素類型是值類型,因爲你可能無法爲因元素類型的默認值來區分沒有匹配,也沒有「真正的」價值。看起來在這種情況下這不太可能是個問題,但值得銘記。

+0

感謝這些精度! :) – 2012-01-10 09:52:58

+0

好點喬恩。看看它是主鍵還是唯一定義的元素是個棘手的問題,不過這是一個很好的補充。 – ThePower 2012-01-10 10:48:30