获取符合条件的第一项或返回第一项

VVS*_*VVS 1 c# linq-to-objects

我想获得满足给定条件的第一个项目,如果没有一个项目符合该条件,我只想获得第一个项目

这就是我目前所做的和有效的,但我不喜欢它。在一个 LINQ 查询中是否有更优雅的方法来做同样的事情?

LookupLine lookup;
Func<KeyValuePair<int,LookupLine>,bool> criteria = 
    (kv) => !kv.Value.Gruppe.StartsWith("SF");

if (lookupLines.Any(criteria))
{
    lookup = lookupLines.First(criteria).Value;
}
else if (lookupLines.Any())
{
    lookup = lookupLines.First().Value;
}

FirstRelevantGroup = lookup.Gruppe;
Run Code Online (Sandbox Code Playgroud)

Dav*_*und 5

好吧,对于单线,你可以做

lookupLines.OrderBy(kv => kv.Value.Gruppe.StartsWith("SF") ? 2 : 1).First();
Run Code Online (Sandbox Code Playgroud)

但我认为您的解决方案更好地传达了您的意图,尽管它可以简化为:

LookupLine lookup = lookupLines.FirstOrDefault(kv => !kv.Value.Gruppe.StartsWith("SF"));
if(lookup == null) {
   lookup = lookupLines.First();
}

FirstRelevantGroup = lookup.Value.Gruppe;
Run Code Online (Sandbox Code Playgroud)

现在,您可以将上述内容合并,但同样会失去一些可读性:

FirstRelevantGroup = (
     lookupLines.FirstOrDefault(kv => !kv.Value.Gruppe.StartsWith("SF"))
     ?? lookupLines.First()
).Value.Gruppe;
Run Code Online (Sandbox Code Playgroud)