C# 如何按代码(或任何字段)对项目列表求和?
我有一个对象,其中包含另一个对象的列表。i、 e Object1包含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
列表
假设这是对象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) };