【问题标题】:Aggregate, sum and product of tuples in ListList 中元组的聚合、总和和乘积
【发布时间】:2015-02-15 07:44:17
【问题描述】:

我有一个Tuple<string, int> 的列表:

"dog", 25
"cat", 5
"cat", 7
"rat", 4
"dog", 10

我需要的 Linq 查询规则必须满足以下条件:我需要按字符串值对元组进行分组,但前提是至少出现 2 次。分组元素的聚合应该是乘法。毕竟我需要聚合元素的总和。在上面的例子中,结果是 25*10 + 5*7 = 285。

到目前为止,除了其他几件事之外,我已经尝试过这个:

var query = from tuple in firstTupleList.Concat(secondTupleList)
                            group tuple.Item2 by tuple.Item1 into g
                            select Tuple.Create(g.Key, g.Aggregate((x, y) => x * y));

这对狗和猫进行了乘法运算,但老鼠仍在列表中,这是错误的。

【问题讨论】:

  • 好的,继续尝试。
  • 这是作业吗?你试过什么?
  • 元组是否保证按键排序?
  • 不,不保证订单。我已经编辑了原始列表以使其更加清晰。

标签: c# linq


【解决方案1】:

你应该可以做到:

var grouped = list.GroupBy(t => t.Item1)
              .Where(g => g.Count() > 1)
              .Select(g => Tuple.Create(g.Key, g.Skip(1).Aggregate(g.First().Item2, (i,j) => i*j.Item2)))
              .ToList();

var total = grouped.Sum(i => i.Item2);

【讨论】:

  • 您也可以根据需要删除元组创建和 ToList()。 var result = tuples.GroupBy(x => x.Item1).Where(x => x.Count() > 1).Select(g => g.Aggregate(1, (acc, t) => acc * t.Item2)).Sum();
【解决方案2】:

给你:

    List<Tuple<string, int>> list = new List<Tuple<string, int>>();
    list.Add(Tuple.Create<string, int>("dog", 25));
    list.Add(Tuple.Create<string, int>("dog", 10));
    list.Add(Tuple.Create<string, int>("cat", 5));
    list.Add(Tuple.Create<string, int>("cat", 7));
    list.Add(Tuple.Create<string, int>("other", 4));

    Dictionary<string, int> dic = list.
     GroupBy(t => t.Item1).
     Where(grp => grp.Count() > 1).
     ToDictionary(grp => grp.Key,
                  grp => grp.Select(tuple => tuple.Item2).Aggregate((a, b) => a * b));

【讨论】:

  • 这给了我与我的方法相同的结果。包含“other”的元组,4仍在列表中,这是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2012-08-23
相关资源
最近更新 更多