2015-05-04 3 views
5

У меня есть 3 Список, содержащий: индекс, имя, возрастСортировка Многократные Списки

Пример:

List<int> indexList = new List<int>(); 
indexList.Add(3); 
indexList.Add(1); 
indexList.Add(2); 
List<string> nameList = new List<string>(); 
nameList.Add("John"); 
nameList.Add("Mary"); 
nameList.Add("Jane"); 
List<int> ageList = new List<int>(); 
ageList.Add(16); 
ageList.Add(17); 
ageList.Add(18); 

теперь я должен сортировать все 3 списка на основе indexList.

Как использовать .sort() для indexList при сортировке другой 2 списка, а

+0

Есть ли причина, по которой у вас есть эти разные списки связанных объектов, вместо того, чтобы хранить их в одном классе с этими свойствами? –

+3

Сделайте «класс», который содержит имя и возраст (и «индекс», если он вам действительно нужен), а затем просто сортируйте их, используя '.OrderBy'. – crashmstr

+0

Словарь/СортировкаList + анонимный класс? – dr4cul4

ответ

16

Вы смотрите на это неправильный путь. Создать собственный класс:

class Person 
{ 
    public int Index { get; set; } 
    public string Name{ get; set; } 
    public int Age{ get; set; } 
} 

Затем сортировать по List<Person> с помощью метода OrderBy из System.Linq имен:

List<Person> myList = new List<Person>() { 
    new Person { Index = 1, Name = "John", Age = 16 }; 
    new Person { Index = 2, Name = "James", Age = 19 }; 
} 
... 

var ordered = myList.OrderBy(x => x.Index); 

Кроме того, вы можете прочитать Jon Skeet article о вашем антишаблоном.

+5

[Как как всемогущий Джон Скит однажды постановил] (http://codeblog.jonskeet.uk/2014/06/03/anti-pattern-parallel-collections/) – Aron

+0

@Aron, спасибо. Я обновил свой ответ ссылкой на эту статью. –

3

Ответ Фархада является правильным и должен быть принят. Но если вам действительно нужно сортировать три связанных списков в том, как вы могли бы использовать Enumerable.Zip и OrderBy:

var joined = indexList.Zip(
     nameList.Zip(ageList, (n, a) => new { Name = n, Age = a }), 
      (ix, x) => new { Index = ix, x.Age, x.Name }) 
     .OrderBy(x => x.Index); 
indexList = joined.Select(x => x.Index).ToList(); 
nameList = joined.Select(x => x.Name).ToList(); 
ageList = joined.Select(x => x.Age).ToList(); 

Все упорядочены по значению индекса-лист впоследствии.

Смежные вопросы