【问题标题】:Extract a sorted list of a list by c#通过c#提取列表的排序列表
【发布时间】: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

【问题讨论】:

    标签: c# list linq


    【解决方案1】:

    使用 LINQ 避免多个 for 循环 你可以在.net Fiddle运行

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
                        
    public class Program
    {
        public static void Main()
        {
             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(c =>  new UsernameAndAmount(){
                    UserName = c.First().UserName,
                    Amount  = c.Sum(i=> i.Amount) 
               } )
             .OrderByDescending(c => c.Amount);
            
              foreach (var item in groupedCustomerList){
                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; }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多