2013-10-03 3 views
1

두 가지 목록이 있습니다.하나의 목록에서 가장 높은 값을 사용하여 두 번째 목록을 정렬합니다.

나는 목록에서 각 학생 객체의 속성은 이름, 성, 및 요금 []이다이

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

처럼 만들어 학생들의 목록을 가지고있다.

수수료는 목록의 각 학생에 대한 수수료 집합을 보유하는 배열입니다. 학생들의 목록을

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

I 루프 각각의 비용을 추가

나는이 같은 두 번째 목록을했다. 그런 다음 각 학생의 합계를 totals 목록에 추가합니다 (두 번째 목록).

이제 students 목록을 정렬해야하므로 수수료가 가장 많은 총 금액이 처음부터 나와야합니다. 즉, totals의 최고 값을 사용하여 students을 정렬해야합니다. 이 같은 totals에서 가장 높은 값을 얻을 수 있습니다 :

double highestTotalAmountDue = totals.Max(); 

가 어떻게 가장 높은 수수료 총 학생은 목록의 시작 부분에이되도록 students 목록을 정렬이 highestTotalAmountDue 값을 사용합니까?

그냥 명확히하기 위해 가장 높은 수수료 합계를 가진 학생을 목록 상단에 추가하면됩니다. 나머지는 동일한 순서로 유지 될 수 있습니다.

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???? 

이 도와주세요 :

여기에 지금까지 내 코드입니다. 미리 감사드립니다. 내가 바로 그것을 가지고있는 경우에

답변

2

합계 목록을 버립니다. 가장 높은 합계를 다음과 같이 추적 한 다음 학생을 목록 상단에 다시 삽입하십시오.

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

:

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

이 상단에있는 최대-수수료 금액 학생 (들)을 넣어 것, 다른 하나는 순서가 유지됩니다.

+0

@OP : 당신은 당신이 사용할 수있는 원본 목록을 주문해야하는 경우 '학생 = orderedStudents.ToList()'. –

+0

@ OP의 이점 :이 솔루션은 익명의 부울 값 함수를 사용합니다. 각 학생의 총 수수료가 이전에 계산 된 합계와 같은지 여부. 목록은 결과에 따라 정렬됩니다. 맨 위를 true로, 맨 아래를 false로 지정합니다. – CSJ

+0

@CSJ : 예, 설명해 주셔서 감사합니다. 이것은'OrderBy' 또는'OrderByDescending'을 사용해야하는 경우를 항상 기억하고 있습니다 :'true'를'1','false'를'0'으로 가정하십시오. –

0
double highestTotalAmountDue = totals.Max(); 
int highestIndex = totals.IndexOf(highestTotalAmountDue); 
var student = student[highestIndex]; 
students.RemoveAt(highestIndex); 
students.Insert(highestIndex,studet); 
0

내가 키 코드가 생각 ...

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