Можно ли сортировать массивы по нескольким критериям с помощью сортировки слиянием (C#)? - PullRequest
1 голос
/ 07 мая 2020

Допустим, я получаю следующие строки ввода в консольном приложении:

A 10 20 30
B 5 10 40
C 40 10 20
D 30 25 10

Буквы представляют названия продуктов, второе значение цены, третий балл продукта и четвертый срок службы продукта. Я хочу отсортировать этот список в первую очередь по цене. Если два продукта имеют одинаковую цену, выполните сортировку по оценке продукта. Если два продукта имеют одинаковую цену и одинаковую оценку, я хочу отсортировать их по долговечности и, наконец, по названиям. Возможно ли это с помощью сортировки слиянием? Если да, то как мне решить эту проблему? Я не могу сохранить все эти значения в одном массиве и передать его алгоритму сортировки слиянием, поэтому мне пришлось бы создать несколько массивов. Но как мне тогда отслеживать, какие значения массивов принадлежат друг другу? Я хочу сделать это в C#.

1 Ответ

0 голосов
/ 07 мая 2020

Вы можете просто использовать OrderBy и ThenBy в Списке элементов. Пример ниже:

void Main()
{
    var products = new List<Product>();
    products.Add(new Product() { Name = "A", Price = 10, Score = 20, Endurance = 30 });
    products.Add(new Product() { Name = "B", Price = 5, Score = 10, Endurance = 40 });
    products.Add(new Product() { Name = "C", Price = 40, Score = 10, Endurance = 20 });
    products.Add(new Product() { Name = "D", Price = 30, Score = 25, Endurance = 10 });

    var resultsSorted = products
                        .OrderBy(p => p.Price)
                        .ThenBy(p => p.Score)
                        .ThenBy(p => p.Endurance)
                        .ThenBy(p => p.Name);
}

class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Score { get; set; }
    public int Endurance { get; set; }
}

[ОБНОВЛЕНИЕ]

Вы спросили, как правильно распечатать эти продукты, потому что Console.WriteLine (продукт) не печатает «подробности» продукта. Конечно, это потому, что вы закончили с реализацией метода .ToString() по умолчанию для объектов. Вы должны либо создать эту строку самостоятельно в foreach l oop - либо переопределить метод .ToString(), чтобы он был либо:

   foreach(var product in resultsSorted)
   {
      Console.WriteLine($"Name:{Name}, Price:{Price}, Score:{Score}, Endurance:{Endurance}");
   }

, либо переопределил .ToString


class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Score { get; set; }
    public int Endurance { get; set; }
    public override string ToString()
    {
        return $"Name:{Name}, Price:{Price}, Score:{Score}, Endurance:{Endurance}";
    }
}

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

foreach (var product in resultsSorted)
{
   Console.WriteLine(product);
}
...