2017-12-01 6 views
0

辞書のリストがあり、辞書の各リストの最初の要素のリストを取得したいと考えています。基本的に:C#LINQ辞書の最初のリスト項目を取得する<string、List <object>>

Dictionary<string, List<object>> dico = new Dictionary<string, List<Object>>(); 

    // fill data... 

    List<object> list = new List<Object>(); 
    foreach(var value in dico.Values) 
    { 
     list.Add(value.ElementAt(0)); 
    } 

これはLINQで行うことができます。

ありがとうございます。あなたが保護することができ、あなたが空List Sまたは欠落(null)リストを懸念している場合は

var list = dico.Select(p => p.Value[0]).ToList(); 

+0

"これはLINQで行うことができますか?"ええ、はい。そしてそれはあなたがしたことです。何を探していますか? – gunr2171

+0

あなたはあなたが試みたことを見せてもらえますか? – NetMage

+2

'List 'を持っているときになぜ 'ElementAt'を使うのですか? 'value [0]'を実行してください。どちらの場合も、リストが空であれば例外が発生する危険性があります。 – juharr

答えて

4

DictionaryIEnumerable<KeyValuePair>はそうあなたが、あなたが望むものにそれぞれの値から突出リストに変換することができます実装します投影:私はElementAtOrDefaultListの方法であった、または少なくとも特殊ためケーシング考え

var list = dico.Select(p => p.Value?.FirstOrDefault()).ToList(); 

PSですが、そうではありません。 .NETはまた、静的な型が知られているときのための特別なケースをListをチェック代わりのために型変換を使用して、なぜ私が疑問に思う:

public static T ElementAtOrDefault<T>(this List<T> src, int index) => src.Count > index ? src[index] : default(T); 

簡単なテストは、拡張メソッドが20倍高速Listであることを示しています。

+1

'FirstOrDefault()'を使用できませんでしたか? – maccettura

+0

@maccetturaはい。私は 'ElementAtOrDefault'が特別なケースか' List'のメソッドであると考えましたが、代わりに 'List'のために本体の中に特殊なケーシングがあります。 – NetMage

+0

'.Netはなぜ静的型が分かっているのかという特殊なケースではなく、リストをチェックするために型変換を使用するのだろうと思います:'ビルドされた方法は、 'List'がキャストされていても、 'IEnumerable'はどこかにあります。 https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/guidelines-for-collections#collection-parameters-> 'IEnumerable またはIEnumerableを使用し、オブジェクトがICollectionを実装しているかどうかを動的に確認することを検討してくださいまたはICollection. – mjwills

関連する問題