2

我有一个对象,其中包含另一个对象的列表。即 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 语句一样。

4

4 回答 4

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并为每个组创建一个匿名对象,获取组中第一个项目的代码和名称。(我假设所有具有相同代码的项目也具有相同的名称。)

于 2013-10-17T11:14:28.890 回答
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)
               });
于 2013-10-17T11:14:50.730 回答
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);
}
于 2013-10-17T11:14:42.530 回答
1

除了使用 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) };
于 2013-10-17T11:33:27.643 回答