2010-04-06 59 views

回答

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,但這不會拋出一個例外......)

但是,吃這樣的例外總是給人一種解決方法的氣味,並沒有我想在我的代碼中有什麼。

+0

那麼null將被放入轉換的列表中?沒辦法跳過失敗的一個? – Benny 2010-04-06 15:06:20

+0

您可以隨時使用'Where'方法來過濾'null'值。 – 2010-04-06 15:08:58

+0

@ Benny;不,從一開始你就無法脫身;轉換器代碼必須返回一個值。但是,您可以使用@Samir的建議並過濾結果列表。 – 2010-04-06 15:49:41

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塊。