Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按代码(或任何字段)对项目列表求和?_C#_Linq - Fatal编程技术网

C# 如何按代码(或任何字段)对项目列表求和?

C# 如何按代码(或任何字段)对项目列表求和?,c#,linq,C#,Linq,我有一个对象,其中包含另一个对象的列表。i、 e Object1包含列表 假设这是对象2的定义: public class Object2 { string code, string name, decimal amount } 我希望能够从列表中创建一个列表2,该列表的值将包含类似于select name,code,sum(amount)group by code的内容 这就是我所做的,但它没有包含我通过时所需要的 var newlist = obj2List.Gro

我有一个对象,其中包含另一个对象的列表。i、 e Object1包含
列表

假设这是对象2的定义:

public class Object2
{
    string code,
    string name,
    decimal amount
}
我希望能够从列表中创建一个列表2,该列表的值将包含类似于
select name,code,sum(amount)group by code的内容

这就是我所做的,但它没有包含我通过时所需要的

var newlist = obj2List.GroupBy(x => x.code)
                      .Select(g => new { Amount = g.Sum(x => x.amount) }); 
我希望新列表中的代码和名称与上面的sql语句一样。

您就快到了:

var newlist = obj2List.GroupBy(x => x.code)
                      .Select(g => new
                      {
                          Code = g.First().code,
                          Name = g.First().name,
                          Amount = g.Sum(x => x.amount)
                      });
这将按
code
对项目进行分组,并为每个组创建一个匿名对象,获取组中第一个项目的代码和名称。(我假设具有相同代码的所有项目也具有相同的名称。)

由于您仅按代码分组,因此还需要以某种方式聚合名称。我使用了
string.Join
为每个代码组创建一个类似
“Name1,Name2,Name3”的字符串

现在您可以使用查询,例如使用
foreach

foreach(var x in query)
{
    Console.WriteLine("Code: {0}  Names: {1}  Amount: {2}"
        , x.Code, x.Names, x.Amount);
}

如果您是按代码分组而不是按名称分组,则必须从列表中为名称选择一些内容,可能是First()或Last()或其他内容

var newlist = obj2List.GroupBy(x => x.code).Select(g => new {
                           Code = g.Key, 
                           Name = g.First().name, 
                           Amount = g.Sum(x => x.amount)
               });

除了使用LINQ扩展方法
.GroupBy()
.Select()
之外,您还可以使用纯LINQ语句,如果您来自SQL背景,则更易于阅读

        var ls = new List<Object2>();
        var newLs = from obj in ls
                    group obj by obj.code into codeGroup
                    select new { code = codeGroup.Key, amount = codeGroup.Sum(s => s.amount) };
var ls=new List();
var newLs=来自ls中的obj
按obj.code将obj分组为codeGroup
选择新的{code=codeGroup.Key,amount=codeGroup.Sum(s=>s.amount)};

在SQL中,如果按
分组,则无法选择,必须在“min(name)”上选择聚合’。谢谢……我感谢你的帮助。事实证明,我甚至不需要姓名。代码和金额足以满足我的需要。非常感谢。我很感激,蒂姆的回答也解决了我的问题。我接受了这个答案,因为它来得更早,也解决了我的问题。注意,
code=g.First().code
是不必要的,因为您已经按
code
进行了分组。所以你只需要使用
g.Key
        var ls = new List<Object2>();
        var newLs = from obj in ls
                    group obj by obj.code into codeGroup
                    select new { code = codeGroup.Key, amount = codeGroup.Sum(s => s.amount) };