【发布时间】:2021-08-18 11:52:22
【问题描述】:
我有一个 userList 并想提取它们的排序列表,其中包含 c# 中每个用户的总数。列表中的用户可能不止一个。为此,我使用了另一个列表 usernameAndAmountList 并使用了两个级联 foreach 循环。这可行,但我想知道是否有另一种方法来修改以下代码以避免使用这些 foreach 循环或至少将它们的数量减少到一个?我已将其写入控制台应用程序项目。
这是我的代码:
static void Main(string[] args)
{
List<User> userList = new List<User>();
userList.Add(new User { BuyId = 1, UserID = 2, UserName = "UserTwo", Amount = 20 });
userList.Add(new User { BuyId = 2, UserID = 2, UserName = "UserTwo", Amount = 10 });
userList.Add(new User { BuyId = 3, UserID = 3, UserName = "UserThree", Amount = 30 });
userList.Add(new User { BuyId = 4, UserID = 5, UserName = "UserFive", Amount = 50 });
userList.Add(new User { BuyId = 5, UserID = 5, UserName = "UserFive", Amount = 12 });
userList.Add(new User { BuyId = 6, UserID = 4, UserName = "UserFour", Amount = 14 });
var groupedCustomerList = userList
.GroupBy(u => u.UserID)
.Select(grp => grp.ToList())
.ToList();
double MaximumAmount = 0;
string name = "";
List<UsernameAndAmount> usernameAndAmountList = new List<UsernameAndAmount>();
foreach (var i in groupedCustomerList)
{
double TotalAmount = 0;
foreach (var j in i)
{
TotalAmount += j.Amount;
name = j.UserName;
//Console.WriteLine($"{j.UserName} , {j.Amount.ToString("#,0")}");
}
if (TotalAmount > MaximumAmount)
{
MaximumAmount = TotalAmount;
}
usernameAndAmountList.Add(new UsernameAndAmount { Amount = TotalAmount, UserName = name });
}
var sortedList = usernameAndAmountList.OrderByDescending(c => c.Amount);
//for monitoring:
foreach (var item in sortedList)
Console.WriteLine($"{item.UserName}: {item.Amount.ToString("#,0")}");
}
public class User
{
public int BuyId { get; set; }
public int UserID { get; set; }
public string UserName { get; set; }
public double Amount { get; set; }
}
public class UsernameAndAmount
{
public string UserName { get; set; }
public double Amount { get; set; }
}
结果是:
UserFive: 62
UserTwo: 30
UserThree: 30
UserFour: 14
【问题讨论】: