LINQ Select语句中如何处理异常

4
我有一个如下的LINQ查询:

 m_FOO = rawcollection.Select(p=> p.Split(' ')).Select(p =>
            {
                int thing = 0;

                try
                {
                     thing = CalculationThatCanFail(p[1]);
                }
                catch{}
                return new { Test = p[0], FooThing = thing};
            })
            .GroupBy(p => p.Test)
            .ToDictionary(p => p.Key, s => s.Select(q => q.FooThing).ToList());

因此,CalculationThatCanFail有时会抛出异常。我不想在其中放入null,然后稍后再使用另一个Where语句过滤掉它,而垃圾值同样不可接受。有人知道如何干净地处理这个问题吗?谢谢。

编辑:双重选择语句有很好的理由。此示例已经为简洁而编辑。

2个回答

2

我不确定你的问题是指,你不想在FooThing中使用null,还是你不想在整个匿名类型对象中使用null。无论如何,这个是否符合你的要求?

 m_FOO = rawcollection.Select(p=> p.Split(' ')).Select(p =>
        {
            int thing = 0;

            try
            {
                 thing = CalculationThatCanFail(p[1]);
                 return new { Test = p[0], FooThing = thing};
            }
            catch
            {
                return null;
            }
        })
        .Where(p => p != null)
        .GroupBy(p => p.Test)
        .ToDictionary(p => p.Key, s => s.Select(q => q.FooThing).ToList());

1
是的,我在想是否有任何方法可以避免使用 .Where(p => p != null)。 - Steve
@Steve,哦好的。我不是完全确定,但我想到使用ForEach()扩展方法就是LINQ可以做的唯一一件事情,但即使这样,你最终仍然需要手动构建某种类型的集合/可枚举对象,而不是让LINQ为你构建它。如果我可以问一下,您对“Where”子句有何反对意见? - devuxer

1

对于这些情况,我使用一个 Maybe 类型(类似于 this one)来进行可能返回值的计算,而不是使用 null 或垃圾值。它看起来像这样:

Maybe<int> CalculationThatMayHaveAValue(string x)
{
    try
    {
        return CalculationThatCanFail(x);
    }
    catch
    {
        return Maybe<int>.None;
    }
}

 //...

 var xs = ps.Select(p =>
            {
                Maybe<int> thing = CalculationThatMayHaveAValue(p[1]);
                return new { Test = p[0], FooThing = thing};
            })
            .Where(x => x.FooThing.HasValue);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接