【问题标题】:Using the highest value from one list to sort the second list.使用一个列表中的最大值对第二个列表进行排序。
【发布时间】:2013-10-10 19:01:03
【问题描述】:

有两个列表。

我有一个学生名单,是这样制作的

List<Student> students = new List<Student>();

列表中每个学生对象的属性是 firstName、LastName 和 Fees[]。

Fees 是一个数组,其中包含列表中每个学生的一组费用。

我做了第二个这样的列表:

List<double>  totals = new List<double>();

我遍历学生列表,并将每个学生的费用相加。然后我将每个学生的总数添加到totals 列表(我的第二个列表)。

现在我需要对students 列表进行排序,因此最高的应付费用总额位于开头。换句话说,我需要使用totals 中的最高值对students 进行排序。我可以像这样从totals 中获得最高值:

double highestTotalAmountDue = totals.Max();

如何使用此highestTotalAmountDue 值对students 列表进行排序,以使总费用最高的学生位于列表的开头??

为了澄清,我只需要将总费用最高的学生添加到列表顶部。其余的可以保持相同的顺序。

到目前为止,这是我的代码:

List<double> totals = new List<double>();
double tempTotal = 0;

Lis<Student> students = new Lis<Student>();

// populate the students list

foreach (var item in students)
{
    for (var i = 0; i < resultSet[0].Fees.Length; i++)
    {
        tempTotal += item.Fees[i].Amount;
    }

    totals.Add(tempTotal);
    tempTotal = 0;
}

double highestTotalAmountDue = totals.Max();

// now what to do to sort the students list by highestTotalAmountDue to put the student with the highest fee due at the top????

请帮忙。提前致谢。

【问题讨论】:

    标签: c# list sorting highest


    【解决方案1】:

    我认为关键代码是……

    var studentToMove = students.FirstOrDefault(x => x.FeesTotal == students.Max(s => s.FeesTotal));
    students.Remove(studentToMove);
    students.Insert(0, studentToMove);
    
    
    
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>()
                {
                    new Student()
                        {
                            FirstName = "Joe", LastName = "Smith",
                            Fees = new Fee[]
                                {
                                   new Fee()
                                       {
                                           Amount = 55
                                       }, 
                                    new Fee()
                                        {
                                            Amount = 100
                                        }
                                }
                        },
                        new Student()
                        {
                            FirstName = "Jane", LastName = "Smith",
                            Fees = new Fee[]
                                {
                                   new Fee()
                                       {
                                           Amount = 400
                                       }, 
                                    new Fee()
                                        {
                                            Amount = 32
                                        }
                                }
                        },
    
                        new Student()
                        {
                            FirstName = "Sam", LastName = "Smith",
                            Fees = new Fee[]
                                {
                                   new Fee()
                                       {
                                           Amount = 3
                                       }, 
                                    new Fee()
                                        {
                                            Amount = 10
                                        }
                                }
                        }
                };
    
            var studentToMove = students.FirstOrDefault(x => x.FeesTotal == students.Max(s => s.FeesTotal));
            students.Remove(studentToMove);
            students.Insert(0, studentToMove);
    
            foreach (var student in students)
            {
                Console.WriteLine("Student: " + student.FirstName + " " + student.LastName);
            }
        }
    }
    
    class Student
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Fee[] Fees { get; set; }
    
        public decimal FeesTotal
        {
            get
            {
                if (Fees == null || Fees.Length == 0)
                    return 0;
    
                return Fees.Sum(x => x.Amount);
            }
        }
    }
    
    class Fee
    {
        public decimal Amount { get; set; }
    }
    

    【讨论】:

      【解决方案2】:
      double highestTotalAmountDue = totals.Max();
      int highestIndex = totals.IndexOf(highestTotalAmountDue );
      var student = student[highestIndex];
      students.RemoveAt(highestIndex);
      students.Insert(highestIndex,studet);
      

      【讨论】:

        【解决方案3】:

        取消总计列表。您可以按如下方式跟踪最高总数,然后将学生重新插入列表顶部。

        List<Student> students = new List<Student>();
        // populate the students list
        
        // Mark the student with the highest total as we find him.
        Student highestTotalStudent = null;
        var highestTotal = 0.0;
        
        foreach (var student in students)
        {
            var tempTotal = 0.0;
        
            for (var i = 0; i < resultSet[0].Fees.Length; i++)
            {
                tempTotal += student.Fees[i].Amount;
            }
        
            if (tempTotal > highestTotal)
            {
                // We have a new winner
                highestTotal = tempTotal;
                highestTotalStudent = student;
            }
        }
        
        // Finally, remove the located student, and re-insert her at the top of the list
        students.Remove(highestTotalStudent);
        students.Insert(0, highestTotalStudent);
        

        【讨论】:

          【解决方案4】:

          如果我猜对了:

          var orderedStudents = students
              .OrderByDescending(s => s.Fees.Sum(f => f.Amount) == highestTotalAmountDue);
          

          这会将最大费用金额的学生放在顶部,另一个将保持无序。

          【讨论】:

          • @OP:如果您需要订购原始列表,您可以使用students = orderedStudents.ToList()
          • 为了@OP 的利益:此解决方案使用匿名布尔值函数:每个学生的总费用是否等于先前计算的总费用。列表根据结果排序:真到上,假到下。
          • @CSJ:是的,感谢您的解释。如果我需要使用OrderByOrderByDescending,这就是我一直记得的方式:假设true1false0
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-29
          • 1970-01-01
          相关资源
          最近更新 更多