2

さて、質問はかなり難しいです。これが私のメインリストです

List<List<KeyValuePair<string, double>>> dblWordFreqByCluster = new List<List<KeyValuePair<string, double>>>();

それでは、リストの例を挙げましょう

(house,40),(home,20),(monitor,40)
(home,10),(work,60),(monitor,30)
(school,70),(home,10),(word,20)

したがって、各行は でList<KeyValuePair<string, double>>あり、これらすべての行を含む最大のリストがあります。

私がしたいのは、各単語の値を選択し、それらの合計を選択してから、このリスト全体の単語数を分割することです。したがって、この変更後、リストは次のようになります

(house,40),(home,40/3),(monitor,70/2)
(home,40/3),(work,60),(monitor,70/2)
(school,70),(home,40/3),(word,20)

つまり、各キーの平均値を取得し、各キーの値を更新します。

C# 4.0 WPF

4

1 に答える 1

7

Linqを使用すると非常に簡単です。まず、各キーの平均を計算します。

var averages =
    (from list in dblWordFreqByCluster
     from kvp in list
     group kvp by kvp.Key into g
     select new 
     {
         Key = g.Key,
         Avg = g.Average(kvp => kvp.Value)
     }).ToDictionary(x => x.Key, x => x.Avg);

次に、リストを更新します。は不変であるためKeyValuePair、アイテムを新しいものと交換する必要があります。

foreach (var list in dblWordFreqByCluster)
{
    for (int i = 0; i < list.Count; i++)
    {
        string key = list[i].Key;
        list[i] = new KeyValuePair<string, double>(key, averages[key]);
    }
}
于 2012-04-05T00:49:36.857 に答える