如何在LINQ Select语句中处理异常

时间:2010-01-28 23:11:09

标签: c# linq

我有一个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语句过滤掉它,并且垃圾值同样是不可接受的。有谁知道如何干净利落地处理这个问题?感谢。

编辑:双重Select语句有充分的理由。为简洁起见,编辑了此示例

2 个答案:

答案 0 :(得分:2)

我不清楚你的意思是,你不想将null用于FooThing,或者你不想使用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 :(得分: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);