2016-11-04 5 views
1

私はListItemCollectionです。各要素の型はListItemです。私は与えられた値を持つ項目を持つテキストだけを返したい。 LINQでこれを行う方法はありListItemCollection - LINQで値からテキストを取得

public string GetTextFromPaymentWayCollection(string value) 
{ 
    ListItemCollection listPaymentWays = DB.GetList(); 

    foreach (ListItem item in listPaymentWays) 
    { 
    if (item.Value == value) 
    { 
     return item.Text; 
    } 
    } 
    return null; 
} 

、代わりにこの機能を使用した:今のところ

、私はこの機能を使用していますか?

答えて

5

listPaymentWaysIEnumerable<T>を実装していないListItemCollectionです。 linqメソッドはIEnumerable<T>の拡張メソッドです。

例えばFirstOrDefaultの署名:

public static TSource FirstOrDefault<TSource>(
    this IEnumerable<TSource> source 
) 

あなたは何をすべきでFirstOrDefaultを使用Cast最初(IEnumerble<ListItem>を返します)、その後、次のとおりです。

var result = listPaymentWays.Cast<ListItem>() 
          .FirstOrDefault(x => x.Value == value)?.Text; 

?.はC#6.0 Null Proparation機能です。


また、私はDB.GetList()フィルタリングをデータベースにしていないメモリに発生しますので、値を取得するメソッドを公開することをお勧めします。すべてのデータを持ってきて、ListItemsを作成して1つのアイテムだけを取るのは無駄です。

+0

ありがとう、これは動作します。最後にこの疑問符は何ですか?おそらくあなたはそれに関するドキュメンテーションへのリンクを持っていますか? – FrenkyB

+0

@FrenkyB - 更新を参照 –

2
return listPaymentWays.FirstOrDefault(x => x.Value == value)?.Text; 

正常に動作するはずです。

+0

なぜ私はListItemCollectionでFirstOrDefaultを使用できないのですか? – FrenkyB

+0

@FrenkyB System.Linqをインクルードしましたか? – drajvver

2

Whereを使用するには、まずキャストする必要があります。残りは普通のLinqです。

string s = listPaymentWays.Cast<ListItem>().ToDictionary(i => i.Value, i => i.Text).Where(x => x.Value == value).FirstOrDefault().Value; 
+1

なぜ辞書に変換してから 'Where'ですか?必要なし :) –

関連する問題