Sort list of string arrays c#

12,924

Solution 1

You can use LINQ:

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

Your sample:

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

Result:

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

Solution 2

You can do:

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

This will assume that your List will have an element of string array with a length of at least 3 items. This will first sort the List based on First item of the array, Animal, Then Bread and then Name.

If your List is defined as:

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

A better way to approach that problem would be to have custom class, with Type, Bread and Name as property and then use that instead of string[]

You can define your own class:

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

and then define your List<Animal> like:

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"),
};

Later you can get the sorted list like:

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

If you want, you can implement your own custom sorting, see: How to use the IComparable and IComparer interfaces in Visual C#

Share:
12,924
suhMAN
Author by

suhMAN

Updated on June 22, 2022

Comments

  • suhMAN
    suhMAN almost 2 years

    I have a list of string arrays, where the arrays are formatted as [Animal, Breed, Name]:

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

    How would I sort this list so that it was arranged alphabetically by "Animal", and then "Breed"? i.e.:

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

    I am currently trying:

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

    But that is not sorting the second column correctly. In addition to sorting by the first two columns alphabetically, how would I then add in the third column?