2011-09-30 8 views
15

に変換してください。オブジェクトのリストを取得し、そのキーがオブジェクトのフィールドである辞書に変換したいと思います。値は別のキーに一致するオブジェクト内のフィールド。私は今ループでこれを行うことができますが、私はこれがlinqで達成することができ、ループを書く必要はないと思う。私はGroupByToDictionaryの組み合わせを考えていましたが、これまでには失敗しました。ここでリストを<MyObject>をDictionary <obj.string、List <obj.ID>>

は、私は今それをやっている方法は次のとおりです。

var samplesWithSpecificResult = new Dictionary<string, List<int>>(); 
foreach(var sample in sampleList) 
{ 
    List<int> sampleIDs = null; 
    if (samplesWithSpecificResult.TryGetValue(sample.ResultString, out sampleIDs)) 
    { 
     sampleIDs.Add(sample.ID); 
     continue; 
    } 
    sampleIDs = new List<int>(); 
    sampleIDs.Add(sample.ID); 
    samplesWithSpecificResult.Add(sample.ResultString, sampleIDs); 
} 

私は.GroupBy().ToDictionay()を得ることができる最も遠いがDictionary<sample.ResultString, List<sample>>です。

ご協力いただければ幸いです。

+0

使用します。 microsoft.com/en-us/library/bb460184。aspx) –

答えて

28

は、そのResultStringメンバーで、リスト内の次

var dictionary = sampleList 
    .GroupBy(x => x.ResultString, x => x.ID) 
    .ToDictionary(x => x.Key, x => x.ToList()); 

GroupBy句の意志グループごとSampleのインスタンスを試してみて、それは、各サンプルのだけId一部を維持します。これは、すべての要素がIGrouping<string, int>になることを意味します。

部分は、IGrouping<string, int>Keyを辞書キーとして使用します。 IGrouping<string, int>IEnumerable<int>を実装しています。したがって、IdのコレクションをToListという呼出しでList<int>に変換することができます。これはKeyという辞書のValueになります。 // MSDN:

+0

これはまさに私が探していたものです。ありがとう! – Marcus

1
var samplesWithSpecificResult = 
    sampleList.GroupBy(s => s.ResultString) 
       .ToDictionary(g => g.Key, g => g.Select(s => s.ID).ToList()); 

私たちは「再ここでやっと、グループは彼らのResultStringに基づいたサンプルである - これはIGrouping<string, Sample>にそれらを置きます。次に、IGroupingのコレクションをディクショナリに投影し、辞書キーとしてそれぞれのKeyを使用し、各グループの列挙(IGrouping<string, Sample>IEnumerable<Sample>)を使用して、各サンプルのIDを選択してディクショナリ値のリストを作成します。

2

うん、超簡単。キーは、IEnumerable<T>GroupByを実行すると、それぞれの "グループ"がIEnumerable<T>を実装するオブジェクトであることがわかります。そのため、以下ではg.Selectと言うことができます。元のシーケンスの要素を共通のキーで投影しています。すべてのグループ共通鍵とSampleの順序になるように

var dictionary = 
    sampleList.GroupBy(x => x.ResultString) 
       .ToDictionary(
        g => g.Key, 
        g => g.Select(x => x.ID).ToList() 
    ); 

参照は、sampleList.GroupBy(x => x.ResultString)の結果はIEnumerable<U>IEnumerable<IGrouping<string, Sample>>IGrouping<T, U>道具です!

3
Dictionary<string, List<int>> resultDictionary = 
(
    from sample in sampleList 
    group sample.ID by sample.ResultString 
).ToDictionary(g => g.Key, g => g.ToList()); 

あなたがリストの辞書の代わりにルックアップを使用して検討する必要があります

ILookup<string, int> idLookup = sampleList.ToLookup(
    sample => sample.ResultString, 
    sample => sample.ID 
); 

は、[検索](HTTPを愛することを学ぶthusly

foreach(IGrouping<string, int> group in idLookup) 
{ 
    string resultString = group.Key; 
    List<int> ids = group.ToList(); 
    //do something with them. 
} 

//and 

List<int> ids = idLookup[resultString].ToList(); 
+0

ルックアップは良いアイデアであり、私が間違いなく遊んでいるものです。ありがとう! – Marcus

関連する問題