1

私はLinqが初めてです。次のようなコードがあります。

public class Data
{
    public Dictionary<string,int> WordFrequency; 
}
List<Data> dataList;

私が欲しいのは、Data オブジェクトのリスト全体に対して結合された WordFrequency を実行する 1 つの集約された辞書です。ループを使用してこれを行う方法を知っています (リストを反復し、次に各辞書を反復します)、私の質問は、これの Linq 構文は何ですか? ありがとうございました。

編集: これが私の (テストされていない) ループ アプローチです。

    public static Dictionary<string, int> Combine()
    {
        Dictionary<string, int> result;
        foreach (Data data in DataList)
        {
            foreach (string key in data.WordFrequencies.Keys)
            {
                if(!result.ContainsKey(key))
                    result[key] = 0;

                result[key] += data.WordFrequencies[key];
            }
        }
   }
4

2 に答える 2

6

ですから、すべての辞書を 1 つの辞書にフラット化して、キーの重複をなくしたいとお考えですか?もちろん?

Enumerable.SelectManyすべてをフラット化しEnumerable.GroupBy、キーをグループ化するために使用できます。

Dictionary<string, int> allWordFrequency = dataList
            .SelectMany(d => d.WordFrequency)
            .GroupBy(d => d.Key)
            .ToDictionary(g => g.Key, g => g.Sum(d => d.Value));

すべての周波数を合計したいと思います。

于 2013-02-12T21:21:18.150 に答える
0

これは、ほとんどの点でティムのものと同じクエリベースのソリューションです。

Dictionary<string, int> allWordFrequency =
    (from d in dataList
    from kvp in d.WordFrequency
    group kvp.Value by d.Key)
       // ^^^^^^^^^ this grouping projection...
    .ToDictionary(g => g.Key, g => g.Sum());
  // ...eliminates need for lambda here ^^

投稿のループベースのアプローチで、 2 つのfrom句がネストされたループをどのように模倣しているかに感謝します。foreachTim のソリューションと同様に、クエリは Keys コレクションを反復するのではなく、ディクショナリの KeyValuePair を反復します。この方法では、クエリは、対応する整数カウント値を取得するためにインデクサーを呼び出す必要がありません。

于 2013-02-13T05:33:12.690 に答える