Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# List.ConvertAll和exception_C#_Exception_List - Fatal编程技术网

C# List.ConvertAll和exception

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

如果ConvertAll在一个元素上引发异常,我是否可以跳过此元素并继续到下一个元素?

否。该异常需要在某个地方处理。如果您预期转换器中会发生异常(这对应用程序来说是正常的),则必须在转换器中有一个try-catch(对于失败的转换,以下代码示例将返回
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);