首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >选择多个字段分组依据和求和

选择多个字段分组依据和求和
EN

Stack Overflow用户
提问于 2013-04-19 16:57:53
回答 3查看 98.3K关注 0票数 47

我想用linq (对象列表)做一个查询,但我真的不知道怎么做,我可以做分组和求和,但不能选择其余的字段。示例:

代码语言:javascript
复制
ID  Value     Name   Category
1   5         Name1  Category1  
1   7         Name1  Category1
2   1         Name2  Category2
3   6         Name3  Category3
3   2         Name3  Category3

我想按ID分组,按值求和,并返回所有字段,如下所示。

代码语言:javascript
复制
ID  Value     Name   Category
1   12        Name1  Category1  
2   1         Name2  Category2
3   8         Name3  Category3
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-19 17:17:26

更新:如果您试图避免对所有字段进行分组,则可以仅按Id进行分组

代码语言:javascript
复制
data.GroupBy(d => d.Id)
    .Select(
        g => new
        {
            Key = g.Key,
            Value = g.Sum(s => s.Value),
            Name = g.First().Name,
            Category = g.First().Category 
        });

但是这段代码假设对于每个Id,应用相同的NameCategory。如果是这样的话,你应该考虑按照@Aron的建议进行规范化。这意味着将IdValue放在一个类中,并将NameCategory (以及同一个Id的任何其他字段相同的字段)移到另一个类中,同时还可以引用Id。标准化过程减少了数据冗余和依赖性。

票数 108
EN

Stack Overflow用户

发布于 2013-04-19 17:09:19

代码语言:javascript
复制
void Main()
{
            //Me being lazy in init
    var foos = new []
    {
        new Foo { Id = 1, Value = 5},
        new Foo { Id = 1, Value = 7},
        new Foo { Id = 2, Value = 1},
        new Foo { Id = 3, Value = 6},
        new Foo { Id = 3, Value = 2},
    };
    foreach(var x in foos)
    {
        x.Name = "Name" + x.Id;
        x.Category = "Category" + x.Id;
    }
            //end init.

    var result = from x in foos
                group x.Value by new { x.Id, x.Name, x.Category}
                into g
                select new { g.Key.Id, g.Key.Name, g.Key.Category, Value = g.Sum()};
    Console.WriteLine(result);
}

// Define other methods and classes here
public class Foo
{
    public int Id {get;set;}
    public int Value {get;set;}

    public string Name {get;set;}
    public string Category {get;set;}   
}
票数 4
EN

Stack Overflow用户

发布于 2013-04-19 17:14:25

试试这个:

代码语言:javascript
复制
var objList = new List<SampleObject>();

objList.Add(new SampleObject() { ID = 1, Value = 5, Name = "Name1", Category = "Catergory1"});
objList.Add(new SampleObject() { ID = 1, Value = 7, Name = "Name1", Category = "Catergory1"});
objList.Add(new SampleObject() { ID = 2, Value = 1, Name = "Name2", Category = "Catergory2"});
objList.Add(new SampleObject() { ID = 3, Value = 6, Name = "Name3", Category = "Catergory3"});
objList.Add(new SampleObject() { ID = 3, Value = 2, Name = "Name3", Category = "Catergory3"});

var newList = from val in objList
              group val by new { val.ID, val.Name, val.Category } into grouped
              select new SampleObject() { ID = grouped.ID, Value = grouped.Sum(), Name = grouped.Name, Category = grouped.Category };

要检查LINQPad,请执行以下操作:

代码语言:javascript
复制
newList.Dump();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16100900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档