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

问题描述 投票:0回答:3

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

这是我目前正在做的事情,但是有效,但是我不喜欢它。在一个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;
c# linq-to-objects
3个回答
2
投票

嗯,如果是一线,你可以做

lookupLines.OrderBy(kv => kv.Value.Gruppe.StartsWith("SF") ? 2 : 1).First();

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

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

FirstRelevantGroup = lookup.Value.Gruppe;

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

FirstRelevantGroup = (
     lookupLines.FirstOrDefault(kv => !kv.Value.Gruppe.StartsWith("SF"))
     ?? lookupLines.First()
).Value.Gruppe;

1
投票

我想要一种扩展方法。

public static T FirstIfNotFound<T>(this IEnumerable<T> source, Func<T,bool> predicate)
{
   if (source==null||predicate==null) throw new ArgumentNullException();
   return source.Any(predicate) ? source.FirstOrDefault(predicate) : source.First();
}

0
投票

我最喜欢的一个班轮是

source.Where(predicate).Concat(source).FirstOrDefault()

此返回

  • 如果有第一个匹配元素。
  • 第一个元素,如果音符匹配。
  • 如果列表为空,则为null。
© www.soinside.com 2019 - 2024. All rights reserved.