是否可以使用合并排序 (C#) 基于多个条件对数组进行排序?

Is it possible to sort arrays based on multiple criteria using merge sort (C#)?

假设我在控制台应用程序中得到以下输入行:

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

字母代表产品名称,第二个是超值价格,第三个是产品评分,第四个是产品续航。我想首先根据价格对这个列表进行排序。如果两个产品的价格相同,则根据产品得分排序。如果两个产品的价格和产品得分相同,我想按产品耐用性排序,最后按名称排序。这可以使用合并排序吗?如果是这样,我应该如何解决这个问题?我无法将所有这些值存储到一个数组中并将其传递给合并排序算法,因此我必须创建多个数组。但是我如何跟踪数组的哪些值属于一起呢?我想在 C# 中执行此操作。

您可以简单地在元素列表上使用 OrderByThenBy。下面的示例:

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(product) 没有打印 "details" 产品。当然,这是因为您最终在对象上默认实现了 .ToString() 方法。您必须在 foreach 循环中自己创建此字符串 - 或者覆盖 .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);
}