【问题标题】:How to select list of keyvaluepairs in List<List<keyvaluepair<string,double>>> and modify their values ? C#如何在 List<List<keyvaluepair<string,double>>> 中选择键值对列表并修改它们的值? C#
【发布时间】:2012-05-03 04:53:24
【问题描述】:

现在这个问题很难。现在这是我的主要清单

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&lt;KeyValuePair&lt;string, double&gt;&gt;,并且有一个包含所有这些行的最大列表。

我想要做的是选择每个单词的值,将它们相加,然后除以整个列表中的单词数。所以经过这个修改列表会变成如下

(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

【问题讨论】:

  • “我要做的是选择每个单词的值,将它们相加,然后除以整个列表中的单词数。”恐怕我不确定你的意思,你能改写一下吗?

标签: c# linq select key-value


【解决方案1】:

使用 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]);
    }
}

【讨论】:

  • 是的,工作得很好。难道没有用 linq 的键来修改键值对的值吗?我的意思是代替第二部分的 foreach 循环,另一个 linq 将修改主列表?我的意思是它将选择每个键值对并从字典中获取该键值对的新值并更新它。如果可能的话,那就太棒了。
  • @MonsterMMORPG:阅读提供的答案:由于 KeyValuePair 是不可变的,您需要用新的项目替换项目 - 这应该很清楚。
  • 是的,我现在知道了 :) 解决方案完美。谢谢@Thomas Levesque
  • @MonsterMMORPG,Linq 不提供修改数据的方法,只能查询。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多