C# 选择分组结果

C# 选择分组结果,c#,linq,group-by,C#,Linq,Group By,我有一份客户名单 public class Client { public string ClientID { get; set; } // Client public decimal Amount { get; set; } // Sales $ } e、 g.提供以下数据: ClientID | Amount ---------+------- 000021354| 200 000021353| 300 000021353| 400 000021352| 1

我有一份客户名单

public class Client
{
    public string ClientID { get; set; } // Client
    public decimal Amount { get; set; } // Sales $
}
e、 g.提供以下数据:

ClientID | Amount
---------+-------
000021354|   200
000021353|   300
000021353|   400
000021352|   100
000021351|   200
000021350|   100
代码:


但不知何故,我的分组不起作用:

var Grouped = cList.GroupBy(x => x.ClientID)
                .OrderByDescending(x => x.Select( y=> y.Amount).Sum())
                .Select(x => x).Take(3); //how to add "others" ?
这项工作:

        var Grouped = (from Group in (from client in clients
                                      group client by client.Id into clientGroup
                                      select new { Id = clientGroup.Key, Sum = clientGroup.Sum(cc => cc.Amount) })
                       orderby Group.Sum descending
                       select Group).Take(3).ToList(); ;
        var Top3 = Grouped.Take(3).ToList();
        var Others = Grouped.Skip(3).ToList();
如果你想把“其他人”列为一个列表。否则,将最后一行更改为:

var Others = Grouped.Skip(3).Sum(g => g.Sum);

要得到其他人的总和。

要做你需要做的事,我想你需要先做小组,然后创造你期望的结果

var query=cList.GroupBy(x => x.ClientID)
               .Select(g=>new{UserId=g.Key, Amount=g.Sum(y=>y.Amount)})
               .OrderByDescending(e=>e.Amount);

var result= query.Take(3).Concat(new[]{new {UserId="others", Amount=query.Skip(3).Sum(e=>e.Amount)}});

PS:我使用匿名类型来投影我的查询,因为我认为它是linq to entities,但是如果您使用的是上面显示的列表,您可以投影到您的
客户机
类我会使用类似的方法

var grouped = a.GroupBy(x => x.ClientID, y => y.Amount)
               .Select(x => new Client { ClientID = x.Key, Amount = x.Sum() })
               .OrderByDescending(x => x.Amount);

var final = grouped.Take(3).ToList();
final.Add(new Client { ClientID = "Others", Amount = grouped.Skip(3).Sum(x => x.Amount) });

请记住,
GroupBy
将返回分组,而不是
客户端的列表。在本例中,您可以使用匿名对象轻松地将分组投影回列表中

var clients = cList.GroupBy(x => x.ClientID)
                     .Select(x => new { ClientID = x.Key, AmountTotal = x.Sum(c => c.Amount) })
                     .OrderByDescending(x => x.AmountTotal);

var topThree = clients.Take(3);
var others = clients.Except(topThree);

如果有的话,你目前得到的结果是什么?“但不知为什么我的分组不起作用”你是什么意思?你有编译器错误吗?运行时异常?意外结果?@Rik-意外结果,我不知道如何添加“其他人”@Byyo“前三名”是什么意思?第一个结果是什么?最高金额?每个客户端的最高金额?@Byyo,仅供参考,使用这种方法,您的查询将不会具体化,除非您迭代结果或调用
ToList
扩展方法,以防您希望保持延迟执行
var query=cList.GroupBy(x => x.ClientID)
               .Select(g=>new{UserId=g.Key, Amount=g.Sum(y=>y.Amount)})
               .OrderByDescending(e=>e.Amount);

var result= query.Take(3).Concat(new[]{new {UserId="others", Amount=query.Skip(3).Sum(e=>e.Amount)}});
var grouped = a.GroupBy(x => x.ClientID, y => y.Amount)
               .Select(x => new Client { ClientID = x.Key, Amount = x.Sum() })
               .OrderByDescending(x => x.Amount);

var final = grouped.Take(3).ToList();
final.Add(new Client { ClientID = "Others", Amount = grouped.Skip(3).Sum(x => x.Amount) });
var clients = cList.GroupBy(x => x.ClientID)
                     .Select(x => new { ClientID = x.Key, AmountTotal = x.Sum(c => c.Amount) })
                     .OrderByDescending(x => x.AmountTotal);

var topThree = clients.Take(3);
var others = clients.Except(topThree);