【问题标题】:Linq - GroupBy and Sum of resulting collection's property [closed]Linq - GroupBy 和结果集合属性的总和 [关闭]
【发布时间】:2017-04-11 12:32:14
【问题描述】:

我有一个ObjectClass 类型的集合对象。我需要一个查询,它将按Nameproperty 返回对象的分组列表。对于每个分组的元素,各自的 Valueproperty 应该包含该组中所有元素的 Valuevalue 的总和 - 否则 Value 应该为唯一的单个元素保留各自的 Valuevalue。 ObjectClass 类型如下所示。

public class ObjectClass 
{
  int Id;
  string Name;
  int Value;
}

让 var list 的类型为 List<ObjectClass>,并假设其中包含项目。

我试过了:

   var plas = list.GroupBy(p => p.Name).Select(g => new objectClass{
        Value = g.sum(p.value),
        Name = g.select(a=>a.Name).FirstOrDefault()
        });  

请指点我正确的方向。

【问题讨论】:

  • 那不是有效的 C# 代码。
  • 不清楚 " where int value is the sum of groupbyobject" 是什么意思。此外,您不能询问我们您的代码是否正常工作。我们怎么可能比你更了解?
  • 我们可以评估代码是否正确的唯一方法是让您向我们展示输入和输出 - 如果输出不是您想要的,那么我想您可以确定代码不是t 正确。

标签: c# linq group-by


【解决方案1】:

我认为这就是您所需要的......虽然我建议以更清晰的方式表达问题并提供输入和期望/预期的输出。

void Main()
{
    var someObjects = new List<ObjectClass>();

    someObjects.Add(new ObjectClass(){Name="numberWang", Value = 2});
    someObjects.Add(new ObjectClass(){Name="numberWang", Value = 3});
    someObjects.Add(new ObjectClass(){Name="numberTwang", Value = 4});
    someObjects.Add(new ObjectClass(){Name="numberTwang", Value = 5});

    //You could filter this beforehand with a Where clause ie. someObjects.Where(i=>i.Name == "whatever").Sum(i=>i.Value)
    int sumOfValuesOfAllObjects = someObjects.Sum(i=>i.Value);

    var sumByObjectClassName = someObjects.GroupBy(a=>a.Name).Select(b=>
    new ObjectClass() { Name = b.First().Name, Value =b.Sum(c=>c.Value) } );
}   

public class ObjectClass
{
  public string Name;
  public int Value;
}

【讨论】:

  • 我认为您不需要在 Linq 中间使用 ToList(),将其移到末尾会将结果转换为 List,尽管这似乎是 OP 想要的。跨度>
  • 是的,这个解决方案有效,但是性能呢?
  • @PaulF 你是对的......我把它从另一个我在 LINQPad 中的 sn-p 留下......现在删除它并 + 你的评论 :)
  • @AndreaMerlin - 你对性能意味着什么?这是一个非常开放的问题......有什么问题?你试过我的建议了吗?
  • @AndreaMerlin:你需要试试看——如果速度太慢,你可能会发现用 C# 代码重写 Linq 会提供更好的性能。
【解决方案2】:
int i = 0;
List<ObjectClass> foo = new List<ObjectClass>();

foreach(var item in foo.Where(item => item.Name = filter))
{
  i += item.Value;
}

老而金

【讨论】:

  • 据我了解,OP 希望返回一个列表,其中列表中的每个条目由原始列表中的名称和列表中具有匹配名称的所有条目的总和组成 - 即 Group By姓名查询。您的代码仅过滤单个名称并返回单个值的总和 - 而不是所要求的。
  • 谢谢!最后我使用它。 Linq 查询效率不高。
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2018-07-17
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2019-12-16
相关资源
最近更新 更多