我有一个对象,其中包含另一个对象的列表。即Object1包含List<Object2>
。
假设这是对象2的定义:
public class Object2
{
string code,
string name,
decimal amount
}
我希望能够从列表中创建一个list2,其值将包含类似于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语句一样。
答案 0 :(得分:3)
你快到了:
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
对项目进行分组,并为每个组创建一个匿名对象,并获取该组第一项的代码和名称。 (我假设所有具有相同代码的项目也具有相同的名称。)
答案 1 :(得分:2)
如果您按代码而不是按名称进行分组,则必须从列表中选择名称,可能使用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)
});
答案 2 :(得分:1)
var query = Object1.Obj2List
.GroupBy(obj2 => obj2.code)
.Select(g => new {
Names = string.Join(",", g.Select(obj2.name)),
Code = g.Key,
Amount = g.Sum(obj2 => obj2.Amount)
});
由于您只按代码分组,因此您还需要以某种方式聚合名称。我使用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);
}
答案 3 :(得分:1)
您可以使用纯LINQ语句,而不是使用LINQ扩展方法.GroupBy()
和.Select()
,如果您来自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) };