我有一个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语句有充分的理由。为简洁起见,编辑了此示例
答案 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);