2014-05-26 2 views
7

у меня есть список строковых массивов, где массивы форматированных как [Animal, порода, имя]:Сортировать список строковых массивов в C#

{ ["Dog", "Golden Retriever", "Rex"], 
    ["Cat", "Tabby", "Boblawblah"], 
    ["Fish", "Clown", "Nemo"], 
    ["Dog", "Pug", "Daisy"], 
    ["Cat", "Siemese", "Wednesday"], 
    ["Fish", "Gold", "Alaska"] 
} 

Как бы отсортировать этот список так, чтобы он был организован в алфавитном порядке «Животным», а затем «Порода»? т.е .:

{ ["Cat", "Siamese", "Boblawblah"], 
    ["Cat", "Tabby", "Wednesday"], 
    ["Dog", "Golden Retriever", "Rex"], 
    ["Dog", "Pug", "Daisy"], 
    ["Fish", "Clown", "Nemo"], 
    ["Fish", "Gold", "Alaska"] 
} 

В настоящее время я пытаюсь:

animalList.Sort((s, t) => String.Compare(s[0], t[0])); 

Но это не сортировать второй столбец правильно. В дополнение к сортировке по первым двум столбцам в алфавитном порядке, как я мог бы добавить в третий столбец?

+0

возможно дубликат [Multiple "порядке" в LINQ] (http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) –

ответ

9

Вы можете использовать LINQ:

animalList = animalList 
    .OrderBy(arr => arr[0]) 
    .ThenBy(arr => arr[1]) 
    .ToList(); 

Ваш образец:

List<string[]> animalList = new List<String[]>{ 
      new []{"Dog", "Golden Retriever", "Rex"}, 
      new []{"Cat", "Tabby", "Boblawblah"}, 
      new []{"Fish", "Clown", "Nemo"}, 
      new []{"Dog", "Pug", "Daisy"}, 
      new []{"Cat", "Siemese", "Wednesday"}, 
      new []{"Fish", "Gold", "Alaska"} 
     }; 

Результат:

-  [0] {string[3]} string[] 
     [0] "Cat" string 
     [1] "Siemese" string 
     [2] "Wednesday" string 
-  [1] {string[3]} string[] 
     [0] "Cat" string 
     [1] "Tabby" string 
     [2] "Boblawblah" string 
-  [2] {string[3]} string[] 
     [0] "Dog" string 
     [1] "Golden Retriever" string 
     [2] "Rex" string 
-  [3] {string[3]} string[] 
     [0] "Dog" string 
     [1] "Pug" string 
     [2] "Daisy" string 
-  [4] {string[3]} string[] 
     [0] "Fish" string 
     [1] "Clown" string 
     [2] "Nemo" string 
-  [5] {string[3]} string[] 
     [0] "Fish" string 
     [1] "Gold" string 
     [2] "Alaska" string 
5

Вы можете сделать:

var newList = list.OrderBy(r => r[0]) 
        .ThenBy(r => r[1]) 
        .ThenBy(r => r[2]) 
        .ToList(); 

Предположим, что ваш List будет иметь элемент массива строк длиной как минимум 3 предмета. Сначала будет отсортирован список по первому элементу массива, Animal, затем Bread, а затем Name.

Если ваш List определяется как:

List<string[]> list = new List<string[]> { new [] {"Dog", "Golden Retriever", "Rex"}, 
              new [] { "Cat", "Tabby", "Boblawblah"}, 
              new [] {"Fish", "Clown", "Nemo"}, 
              new [] {"Dog", "Pug", "Daisy"}, 
              new [] {"Cat", "Siemese", "Wednesday"}, 
              new [] {"Fish", "Gold", "Alaska"} 
              }; 

лучший способ подойти к этой проблеме будет иметь пользовательский класс, с Type, Bread и Name в собственность, а затем использовать его вместо string[]

Вы можете задать свой собственный класс:

public class Animal 
{ 
    public string Type { get; set; } 
    public string Bread { get; set; } 
    public string Name { get; set; } 

    public Animal(string Type, string Bread, string Name) 
    { 
     this.Type = Type; 
     this.Bread = Bread; 
     this.Name = Name; 
    } 
} 

, а затем определить ваш List<Animal> как:

List<Animal> animalList = new List<Animal> 
{ 
    new Animal("Dog", "Golden Retriever", "Rex"), 
    new Animal("Cat", "Tabby", "Boblawblah"), 
    new Animal("Fish", "Clown", "Nemo"), 
    new Animal("Dog", "Pug", "Daisy"), 
    new Animal("Cat", "Siemese", "Wednesday"), 
    new Animal("Fish", "Gold", "Alaska"), 
}; 

Позже вы можете получить отсортированный список как:

List<Animal> sortedList = animalList 
          .OrderBy(r => r.Type) 
          .ThenBy(r => r.Bread) 
          .ToList(); 

Если вы хотите, вы можете реализовать свою собственную сортировку, см: How to use the IComparable and IComparer interfaces in Visual C#

+0

ОК, я должен совершили какую-то ужасную ошибку, но, пожалуйста, укажите это. – Habib

+2

Это похоже на мой ответ, так почему я не получил downvotes? Я в шоке;) –

+0

@TimSchmelter, я отправил после 2 минут вашего ответа, но я никогда не видел вашего ответа, прежде чем публиковать его. Я считаю, что людям не нравятся повторяющиеся ответы, и, что важно, вы очень популярны: P – Habib

0

Если вы можете использовать LINQ, вы можете сделать что-то вроде:

myanimals = myanimals.OrderBy(a => a[0]).ThenBy(a => a[1]).ToList(); 

Или sam е в запросе:

myanimals = (from a in animals order by a[0], a[1] select a).ToList(); 
Смежные вопросы