2014-09-13 113 views
3

在預先排序的List<int>中,我將找到滿足條件的最後一個元素,例如int lastScore = list.Last(x => x < 100)。如果列表中沒有滿足此條件的元素,則會拋出InvalidOperationException,並顯示錯誤消息:Sequence contains no matching element。這也發生在list.First(...)Enumerable.Last()引發InvalidOperationException「序列中不包含匹配元素」

我甚至試圖讓lastScore爲空也無濟於事。

捕捉異常並手動指定lastScorenull唯一的出路?

+0

歡迎SO!說了這些,我很困惑你的問題。 'List '不能是'list'的類型,因爲'int'當然沒有'Score'屬性。請澄清。 – J0e3gan 2014-09-13 05:07:39

+0

真的很抱歉!我打算寫'list.Last(x => x <100)'。感謝您指出它。我也編輯了這個問題。 – 2014-09-13 05:11:49

回答

3

使用FirstOrDefaultLastOrDefault得到null如果不匹配,假設您正在使用引用類型。這些方法將返回值爲default value的值類型。

+1

在這種情況下('IEnumerable ')它將返回0,而不是null。如果0是有效值,這實際上是有問題的。一種解決方案是首先將序列轉換爲IEnumerable ,儘管在這種情況下我可能只是處理異常。 – user2864740 2014-09-13 05:14:57

+0

是的。那麼,解決方案是什麼? – 2014-09-13 05:18:17

+0

剛發現'FirstOrDetault'和'LastOrDefault'爲值類型返回默認值(例如'int's爲0)。對於'IEnumerable '其中'T'是一個引用類型,它們返回'null'。 – 2014-09-13 13:54:32

0

我可能只是在最接近的使用點捕捉異常

這是因爲LastOrDefault/FirstOrDefault超過一個IEnumerable<int>將返回0(對於int默認值),其可以一個「有效」值 - 這取決於實際的上下文和定義的規則。雖然將序列轉換爲IEnumerable<int?>將允許以前的方法返回null,這似乎是更多的工作,而不是價值。

如果需要對一個繼續使用使用lastScore,考慮:

int? lastScore; /* Using a Nullable<int> to be able to detect "not found" */ 
try { 
    lastScore = list.Last(x => x < 100); /* int -> int? OK */ 
} catch (InvalidOperationException) { 
    lastScore = null; /* If 0 see LastOrDefault as suggested; 
         otherwise react appropriately with a sentinel/flag/etc */ 
} 
if (lastScore.HasValue) { 
    /* Found value meeting conditions */ 
} 

或者,如果能夠拋棄時沒有找到的情況下,可以考慮:

try { 
    var lastScore = list.Last(x => x < 100); 
    /* Do something small/immediate that won't throw 
     an InvalidOperationException, or wrap it in it's own catch */ 
    return lastScore * bonus; 
} catch (InvalidOperationException) { 
    /* Do something else entirely, lastScore is never available */ 
    return -1; 
} 
相關問題