在FirstOrDefault之后检查null?

时间:2018-02-25 19:12:30

标签: c# linq

我想找到满足某个条件的字典的第一个成员,然后从找到的项目中获取一些属性。如果没有找到任何物品我会担心。请考虑以下代码:

Dictionary<int, Class1> dict;
....
....
var foundPair = dict.Select(i => new { i }).FirstOrDefault(somePredicate);
SomeClass result = null;
if (foundPair != null)
    result = foundPair.i.Value.SomeProp;

我正在寻找result,这段代码看起来很模糊。我们可以在单个linq链中获得上述功能吗?我的意思是类似的东西:

var result = protsDict.Select(i => new { i }).FirstOrDefault(somePredicate).SomeLinqChain(...).i.Value.SomeProps;

如果找到某个项目,则结果应为SomeProps;如果未找到任何项目,则结果为null

2 个答案:

答案 0 :(得分:1)

可以通过各种方式重写:

关键是:使用Where

var result = protsDict.Where(somePredicate).SomeLinqChain(...) //some chain
            .Where(someMore) //some more
            .Where(i => i.Value != null) //or even...
            .Select(i =>i.Value.SomeProps).FirstOrDefault();//then select; take or skip

答案 1 :(得分:1)

您可以使用Where后跟Take(1)来隔离最多一个满足条件的元素。

var foundPair = dict
    .Select(i => new { i })
    .Where(somePredicate)
    .Take(1)
    .Select(x => some_mapping(x)
    ...;

以这种方式完成后,只有在找到满足谓词的第一个元素且仅在该元素上才会执行后续表达式。如果更多元素满足谓词,那么除了第一个元素之外的所有元素都将被忽略。

从这个意义上讲,这种技术与FirstOrDefault的工作原理相同,只是安全。