如果ConvertAll在一個元素上拋出異常,我可以跳過這個元素並繼續下一個元素嗎?List.ConvertAll和異常
3
A
回答
6
否。需要在某處處理異常。如果您預計例外轉爐發生(這是應用程序OK),您必須在轉換器內的一個try-catch(下面的代碼示例將返回null
爲失敗的轉換):
List<string> input = new List<string> { "1", "2", "three", "4" };
List<int?> converted = input.ConvertAll(s =>
{
int? result = null;
try
{
result = int.Parse(s);
}
catch (Exception) { }
return result;
});
(是的,我知道我應該使用int.TryParse
,但這不會拋出一個例外......)
但是,吃這樣的例外總是給人一種解決方法的氣味,並沒有我想在我的代碼中有什麼。
1
如果您需要完全跳過投擲元素ConvertAll
不會導致您,但是您可以實施「強健的枚舉」的輔助方法。事情是這樣的:
public static void Main(string[] args)
{
var integers = new List<int>() { 1, 2, -5 };
Converter<int, string> converter = x =>
{
if (x < 0)
throw new NotSupportedException();
return x.ToString();
};
// This code would throw
//var result1 = integers.ConvertAll(converter).ToArray();
//Console.WriteLine(String.Join(Environment.NewLine, result1));
// This code ignores -5 element
var result2 = RobustEnumerating(integers, converter).ToArray();
Console.WriteLine(String.Join(Environment.NewLine, result2));
}
public static IEnumerable<K> RobustEnumerating<T, K>(IEnumerable<T> input,
Converter<T, K> converter)
{
List<K> results = new List<K>();
foreach (T item in input)
{
try
{
results.Add(converter(item));
}
catch { continue; }
}
return results;
}
我只能這樣做,如果返回null
或失敗的轉換等獨特的價值,然後過濾結果排除這些值是不適用的。
1
將Fredrik和Samir給出的答案合併,反向和縮短可能是最簡單的。套用在哪裏,然後再ConvertAll:
List<UnconvertedType> unconverted;
// do something to populate unconverted
List<ConvertedType> converted = unconverted.
Where(ut => ut != null).
ToList().
ConvertAll<ConvertedType>(ut => ut as ConvertedType);
這樣你可以刪除任何異常,他們得到考慮之前,可以移除try/catch塊。
相關問題
- 1. IOException異常和FileNotFoundException異常
- 2. NullPointerException異常和NoSuchElementException異常
- 3. 在List.ConvertAll中使用Lambda表達式
- 4. 類和異常
- 5. onKey和異常
- 6. 異常和IDispatchMessageInspector
- 7. 異常和TDetail
- 8. Method.invoke和異常
- 9. PersianDateCalendar和異常
- 10. IOException異常和NullPointerException異常從ObjectInputStream的
- 11. C++異常和性病繼承::異常
- 12. Ajax異常和webapi異常處理
- 13. 異常,算術異常和對象
- 14. 的Java:OutOfMemoryError異常異常和freeMemory()
- 15. F#異常和內部異常屬性
- 16. app:transformClassesWithDexForDebug異常和java.util.concurrent.ExecutionException
- 17. 繼承和異常
- 18. 異常和內存
- 19. 異常和中斷
- 20. SQLite和Android異常
- 21. Testdriven.Net和NUnit異常
- 22. Springboot和infinispan異常
- 23. 交易和異常
- 24. 異常,Global.asax和eventlog
- 25. JMS和ActiveMQ異常
- 26. Parallel.ForEach和Aggregate異常
- 27. NullPointer異常和FileInputStream
- 28. 異常和輸出
- 29. 異常和取消
- 30. JSF和ManagedBean:NullPointerException異常
那麼null將被放入轉換的列表中?沒辦法跳過失敗的一個? – Benny 2010-04-06 15:06:20
您可以隨時使用'Where'方法來過濾'null'值。 – 2010-04-06 15:08:58
@ Benny;不,從一開始你就無法脫身;轉換器代碼必須返回一個值。但是,您可以使用@Samir的建議並過濾結果列表。 – 2010-04-06 15:49:41