【问题标题】:Remove duplicate items and calculate average values using LINQ删除重复项并使用 LINQ 计算平均值
【发布时间】:2013-06-25 05:08:12
【问题描述】:

例如我有一个对象列表(属性:名称和值)

  • 项目1 20;
  • 项目2 30;
  • 项目1 50;

我想要结果:

  • item1 35 (20+50)/2
  • 项目2 30

我该怎么做?


对不起,伙计们,重复是基于item.Name

【问题讨论】:

  • 您能提供更多信息吗?例如。您在什么基础上确定应该平均第一个和最后一个项目。另外,您说要过滤掉重复项,但示例列表没有重复项。
  • 请花几秒钟谷歌搜索“MSDN LINQ Distinct”和“MSDN LINQ Average”。
  • @Pierre-LucPineault 虽然我同意 OP 应该花更多时间研究,但他显然不知道“不同”一词(至少在这种情况下)。此外,“distinct”是错误的——他想分组。
  • @Jonathon Reinhard 但即使是寻找“Linq 删除重复项”也会在 SO 上产生数十个结果......显然需要更多研究。
  • @Pierre-LucPineault 你看我的评论了吗? “我同意 OP 应该花更多时间研究”——我只是在质疑“独特”的整个前提

标签: c# linq group-by


【解决方案1】:
var results =
  from kvp in source
  group kvp by kvp.Key.ToUpper() into g
  select new
  {
    Key= g.Key,
    Value= g.Average(kvp => kvp.Value)
  }

var results = source.GroupBy(c=>c.Name)
                  .Select(c => new (c.Key, c.Average(d=>d.Value)));

【讨论】:

  • 谢谢罗伯特。这就是我想要的。
  • var results = source.GroupBy(c=>c.Name).Select(c => new (c.Key, c.Average(d=>d.Value)));跨度>
  • 更新了查询和流利的语法
【解决方案2】:

你可以使用平均值和分组来做到这一点:

public class myObject
{
    public string Name {get;set;}
    public double Value {get;set;}
}

var testData = new List<myObject>() { 
                                    new myObject() { Name = "item1", Value = 20 },
                                    new myObject() { Name = "item2", Value = 30 },
                                    new myObject() { Name = "item1", Value = 50 }
                                    };


var result = from x in testData
             group x by x.Name into grp
             select new myObject() { 
                                    Name=grp.Key,
                                    Value= grp.Average(obj => obj.Value)
                                    };

【讨论】:

  • 谢谢鱿鱼 ;) - 来自海星
猜你喜欢
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多