C# 列表中元组的聚合、总和和乘积

C# 列表中元组的聚合、总和和乘积,c#,linq,C#,Linq,我有一个元组列表: 我需要的Linq查询规则必须满足以下要求:我需要按字符串值对元组进行分组,但前提是至少出现两次。分组元素的聚合应该是乘法。毕竟,我需要聚合元素的总和。在上面的例子中,结果是25*10+5*7=285 到目前为止,我已经尝试了以下几项: var query = from tuple in firstTupleList.Concat(secondTupleList) group tuple.Item2 by tuple.It

我有一个元组列表:

我需要的Linq查询规则必须满足以下要求:我需要按字符串值对元组进行分组,但前提是至少出现两次。分组元素的聚合应该是乘法。毕竟,我需要聚合元素的总和。在上面的例子中,结果是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));

这是狗和猫的乘法运算,但rat仍然在列表中,这是错误的。

您应该能够做到:

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);
给你:

    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));
List List=新列表();
添加(Tuple.Create(“dog”,25));
添加(Tuple.Create(“dog”,10));
添加(Tuple.Create(“cat”,5));
list.Add(Tuple.Create(“cat”,7));
list.Add(Tuple.Create(“other”,4));
字典dic=列表。
GroupBy(t=>t.Item1)。
其中(grp=>grp.Count()>1)。
ToDictionary(grp=>grp.Key,
grp=>grp.Select(tuple=>tuple.Item2).Aggregate((a,b)=>a*b));

好的,继续尝试。这是家庭作业吗?你试过什么?元组保证按键排序吗?不,顺序不保证。我对原始列表进行了编辑,使其更加清晰。这给了我与我的方法相同的结果。包含“other”,4的元组仍在列表中,这是错误的。如果需要,还可以删除元组创建和ToList()
var result=tuples.GroupBy(x=>x.Item1)。其中(x=>x.Count()>1)。选择(g=>g.Aggregate(1,(acc,t)=>acc*t.Item2)).Sum()
    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));