我试图实现的是首先按最高Amount
对OrderSummary
进行排序,然后依次显示给定帐户的集合中的所有其他Order
,而不管Amount
如何。预期结果在代码片段中。
public class OrderSummary
{
public string FirstName { get; set; }
public decimal Amount { get; set; }
}
public class Worker
{
public List<OrderSummary> Orders { get; set; }
public Worker()
{
Orders = new List<OrderSummary>()
{
new OrderSummary() {FirstName = "James", Amount = 10.00m},
new OrderSummary() {FirstName = "Thomas", Amount = 11.00m},
new OrderSummary() {FirstName = "Leon", Amount = 13.00m},
new OrderSummary() {FirstName = "Lori", Amount = 14.00m},
new OrderSummary() {FirstName = "Thomas", Amount = 16.00m},
new OrderSummary() {FirstName = "Thomas", Amount = 6.00m},
new OrderSummary() {FirstName = "James", Amount = 19.00m}
};
}
//sorted by highest amount first
//then place firstname together regardless of the amount
//Expected Outcome
/*
James 19 -- highest amount followed by all other orders for James regardless of the amount.
* james 10
* thomas 16
* thomas 11
* thomas 6
* lori 14
* leon 13
*/
}
我的方法是获取多次出现的所有元素,然后找到元素位于除第一个元素之外的索引处,将其从索引中删除,并将其添加到第一个元素的索引 + 1。有没有更好的方法来实现这一目标?
>GroupBy
按照组在源集合中出现的顺序创建组,因此您可以先按数量排序,然后按名称分组,然后"展平"组:
var results = Orders.OrderByDescending(o => o.Amount)
.GroupBy(o => o.FistName) // the groupings will be in order of the largest amount
.SelectMany(g => g); // flatten the groups
试试这个:
var list = Orders.OrderByDescending(y => y.Amount).GroupBy(x => x.FirstName).Select(x=>x.Key).ToList();
这是对记录进行降序排序,然后按FirstName
对它们进行分组,因此您将首先获得Amount
最高的记录,然后是其他记录。
var maxAmount = Orders.Max(o => o.Amount);
var maxPos = Orders.IndexOf(maxAmount);
var maxOrder = Orders[maxPos];
Orders.RemoveAt(maxPos);
Orders.Insert(0, maxOrder);
编辑
我不明白"一个接一个"意味着"按名称分组"......
抱歉,我有一个使用 .Net 小提琴的示例
在这里
问题解答
让我知道这是否有帮助
我的方法是获取多次出现的所有元素,然后找到元素除第一个元素之外的索引,将其从索引中删除,并将其添加到第一个元素的索引 + 1
下面是执行您所描述内容的 LINQ 方法:
var query = from o in Orders
group o by o.FirstName into g
let top = g.Aggregate((a, b) => b.Amount > a.Amount ? b : a)
from o in Enumerable.Repeat(top, 1).Concat(g.Where(o => o != top))
select o;
您首先按名字对订单进行分组,然后对于每个组,您可以使用 Aggregate
找到具有最大金额的元素,将其放在组中的第一个并附加其他元素。最后将结果拉平。