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);