C# List.ConvertAll和exception
如果ConvertAll在一个元素上引发异常,我是否可以跳过此元素并继续到下一个元素?否。该异常需要在某个地方处理。如果您预期转换器中会发生异常(这对应用程序来说是正常的),则必须在转换器中有一个try-catch(对于失败的转换,以下代码示例将返回C# List.ConvertAll和exception,c#,exception,list,C#,Exception,List,如果ConvertAll在一个元素上引发异常,我是否可以跳过此元素并继续到下一个元素?否。该异常需要在某个地方处理。如果您预期转换器中会发生异常(这对应用程序来说是正常的),则必须在转换器中有一个try-catch(对于失败的转换,以下代码示例将返回null): 列表输入=新列表{“1”、“2”、“3”、“4”}; 列表转换=输入。转换所有(s=> { int?结果=null; 尝试 { 结果=int.Parse(s); } 捕获(异常){} 返回结果; }); (是的,我知道我应该使用int
null
):
列表输入=新列表{“1”、“2”、“3”、“4”};
列表转换=输入。转换所有(s=>
{
int?结果=null;
尝试
{
结果=int.Parse(s);
}
捕获(异常){}
返回结果;
});
(是的,我知道我应该使用int.TryParse
,但这不会引发异常…)
然而,吃这样的异常总是会让人觉得有一种解决方法,我不希望代码中有任何异常。如果需要完全跳过抛出元素,则不会产生
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;
}
publicstaticvoidmain(字符串[]args)
{
var integers=new List(){1,2,-5};
转换器=x=>
{
if(x<0)
抛出新的NotSupportedException();
返回x.ToString();
};
//此代码将抛出
//var result1=integers.ConvertAll(converter.ToArray();
//Console.WriteLine(String.Join(Environment.NewLine,result1));
//此代码忽略-5元素
var result2=RobustEnumerating(整数,转换器).ToArray();
Console.WriteLine(String.Join(Environment.NewLine,result2));
}
公共静态IEnumerable RobustEnumerating(IEnumerable输入,
转换器(转换器)
{
列表结果=新列表();
foreach(输入中的T项)
{
尝试
{
结果.添加(转换器(项目));
}
捕获{继续;}
}
返回结果;
}
只有在为失败的转换返回
null
或其他唯一值,然后过滤结果以排除这些值不适用时,我才会这样做。组合、反转和缩短Fredrik和Samir给出的答案可能是最简单的。首先应用Where,然后应用ConvertAll:
List<UnconvertedType> unconverted;
// do something to populate unconverted
List<ConvertedType> converted = unconverted.
Where(ut => ut != null).
ToList().
ConvertAll<ConvertedType>(ut => ut as ConvertedType);
未转换列表;
//做点什么来填充未转换的
列表已转换=未转换。
其中(ut=>ut!=null)。
托利斯()。
ConvertAll(ut=>ut作为ConvertedType);
通过这种方式,您可以在考虑任何异常之前将其删除,并可以删除try/catch块。然后将null放入转换后的列表中?没有办法跳过失败的值吗?您可以随时使用
Where
方法在以后过滤null
值。@Benny;不,你不能从一开始就摆脱它;转换器代码必须返回一个值。但是,您可以使用@Samir的建议并过滤结果列表。
List<UnconvertedType> unconverted;
// do something to populate unconverted
List<ConvertedType> converted = unconverted.
Where(ut => ut != null).
ToList().
ConvertAll<ConvertedType>(ut => ut as ConvertedType);