2010-12-07 1 views
0

を満たしている最初の項目を取得します。私は現在何をしていますか、私はそれが好きではありません。 1つのLINQクエリで同じことを行うよりエレガントな方法はありますか?これは何を私は与えられた基準を満たしているとアイテムのどれもがその基準に一致しない場合、私はちょうど最初の項目</p> <p>を取得したい最初の項目を取得したい基準または最初の項目

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

まあ、ワンライナーのために、あなたは

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; 
+0

KeyValuePairは構造体であり、nullと比較することはできませんが、おかげでそれは私にある程度の自信を与えます。 – VVS

+0

おっと、はい、私はその部分を逃しました。これを 'default(KeyValuePair )'と比較することはできますが、最後の例のように合体することはできません。 –

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(); 
} 
関連する問題