Sort list of string arrays c#

前端 未结 4 1262
野的像风
野的像风 2021-01-18 02:11

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

{ [\"Dog\", \"Golden Retriever\", \"Rex\"],
  [\"Cat\", \"Tabby\", \         


        
相关标签:
4条回答
  • 2021-01-18 02:24

    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#

    0 讨论(0)
  • 2021-01-18 02:28

    If you can use LINQ, you can do something like:

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

    Or the same in query:

    myanimals = (from a in animals order by a[0], a[1] select a).ToList();
    
    0 讨论(0)
  • 2021-01-18 02:35

    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
    
    0 讨论(0)
  • 2021-01-18 02:41

    For a more simple or well-rounded approach, you could use bubble sort to sort your list of string arrays, depending on the element you wish to sort by. For example:

    static void Main(string[] args)
    {
        List<string[]> animalCount = new List<string[]>() 
        { 
            new string[] { "Dogs: ", "12" }, 
            new string[] { "Cats: ", "6" }, 
            new string[] { "Monkeys: ", "15" },
            new string[] { "Fish: ", "26" },
            new string[] { "Dinosaurs: ", "0" },
            new string[] { "Elephants: ", "2" }
        };
    
        List<string[]> sortedAnimalCount = SortedCountList(animalCount);
    
        foreach (string[] item in sortedAnimalCount)
        {
            Console.WriteLine(item[0] + "" + item[1]);
        }
    
        Console.ReadKey();
    }
    
    static List<string[]> SortedCountList(List<string[]> countList)
    {
        string[][] charArray = countList.ToArray();
    
        int ItemToSortBy = 1; // Sorts list depending on item 2 of each string array
        int numItems = charArray.Length;
        bool IsSwapping = true;
        int i = 0;
    
        while (i < (numItems - 1) && IsSwapping == true)
        {
            IsSwapping = false;
    
            for (int j = 0; j < numItems - i - 1; j++) // Bubble sort the List in reverse
            {
                if (Convert.ToInt32(charArray[j][ItemToSortBy]) < Convert.ToInt32(charArray[j + 1][ItemToSortBy]))
                {
                    string[] temp = charArray[j];
                    charArray[j] = charArray[j + 1];
                    charArray[j + 1] = temp;
                    IsSwapping = true;
                }
            }
    
            i += 1;
        }
    
        return charArray.ToList();
    }
    
    • Outputs: Fish: 26 Monkeys: 15 Dogs: 12 Cats: 6 Elephants: 2 Dinosaurs: 0
    0 讨论(0)
提交回复
热议问题