Получить первый элемент, который соответствует критериям или первый элемент - PullRequest
0 голосов
/ 07 декабря 2010

Я хочу получить первый элемент, который соответствует заданным критериям, и, если ни один из элементов не соответствует этому критерию, я просто хочу получить первый элемент

Это то, что я сейчас делаю и что работает, ноМне это не нравитсяЕсть ли более элегантный способ сделать то же самое в одном запросе 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;

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

Ну, для однострочника вы могли бы сделать

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 голос
/ 07 декабря 2010

Я бы хотел метод расширения.

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();
}
...