2015-04-24 3 views
0

Я следующая структура объекта -Как отсортировать список объектов на основе списка объектов в другом списке/главном списке на C#?

public class Student 
{ 
     public int RollNumber { get; set; } 
     public string Name { get; set; } 
     public string Division { get; set; } 
} 

Также у меня есть 2 списка объекта следующим образом:
1) Мастера список -

var masterList = new List<Student> 
{ 
       new Student {RollNumber = 1, Name = "Jim", Division = "A"}, 
       new Student {RollNumber = 10, Name = "Mike", Division = "A"}, 
       new Student {RollNumber = 8, Name = "Peter", Division = "A"}, 
       new Student {RollNumber = 4, Name = "Sandy", Division = "A"}, 
       new Student {RollNumber = 7, Name = "Michale", Division = "A"} 
}; 

2) Подсписок

var subList = new List<Student> 
      { 
       new Student {RollNumber = 4, Name = "Sandy", Division = "A"}, 
       new Student {RollNumber = 7, Name = "Michale", Division = "A"}, 
       new Student {RollNumber = 1, Name = "Jim", Division = "A"}, 
       new Student {RollNumber = 10, Name = "Mike", Division = "A"} 
      }; 

I хочу отсортировать мой подсписчик по порядку объекта в главном списке, например, после применения сортировки порядка объекта в SubList должно быть как -

new Student {RollNumber = 1, Name = "Jim", Division = "A"}, 
new Student {RollNumber = 10, Name = "Mike", Division = "A"}, 
new Student {RollNumber = 4, Name = "Sandy", Division = "A"}, 
new Student {RollNumber = 7, Name = "Michale", Division = "A"} 

Можно ли достичь такой логики сортировки?

ответ

1

Предполагая RollNumber является выявление поля:

var orderedSubList = subList.OrderBy (
    s => masterList.IndexOf(masterList.FirstOrDefault(m => m.RollNumber == s.RollNumber)) 
); 
+0

Спасибо Kaarel за предоставление оптимального решения. –

0

Конечно, это возможно, но вы должны спросить себя, что идентифицирует студента. Поскольку списки в настоящее время не содержат одинаковых учеников в отношении идентификаторов объектов.

Если бы это было, то есть, если masterList и subList действительно содержали те же объекты, вы можете просто заказать их

subList.Sort((s1, s2) => masterList.IndexOf(s1).CompareTo(masterList.IndexOf(s2)); 

В противном случае вы должны определить студентов, например, используя RollNumber.

Редактировать: По сравнению с ответом от kaarel, этот solutuion сортировал бы список на месте, в то время как решение kaarel было бы легче читать.

1

// Предполагая, что дублирующих записей нет.

 var masterList = new List<Student> 
          { 
           new Student {RollNumber = 1, Name = "Jim", Division = "A"}, 
           new Student {RollNumber = 10, Name = "Mike", Division = "A"}, 
           new Student {RollNumber = 8, Name = "Peter", Division = "A"}, 
           new Student {RollNumber = 4, Name = "Sandy", Division = "A"}, 
           new Student {RollNumber = 7, Name = "Michale", Division = "A"} 
          }; 

     var subList = new List<Student> 
          { 
           new Student {RollNumber = 4, Name = "Sandy", Division = "A"}, 
           new Student {RollNumber = 7, Name = "Michale", Division = "A"}, 
           new Student {RollNumber = 1, Name = "Jim", Division = "A"}, 
           new Student {RollNumber = 10, Name = "Mike", Division = "A"} 
          }; 


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

     foreach (var item in masterList.Select(x => x.RollNumber)) 
     { 
      if (subList.Where(x => x.RollNumber == item).FirstOrDefault() != null) 
       sortedList.Add(subList.Where(x => x.RollNumber == item).First()); 
     } 
Смежные вопросы