【问题标题】:Is it possible to sort arrays based on multiple criteria using merge sort (C#)?是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?
【发布时间】:2020-08-23 03:37:48
【问题描述】:

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

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

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

【问题讨论】:

  • 我无法将所有这些值存储到一个数组中并将其传递给归并排序算法 为什么不能创建这样的数组?这是对此类数据进行排序的最方便的方法。首先,您应该创建一个类来保存每一行的所有值。然后为这个类定义比较器。最后使用标准库使用创建的比较器对对象数组进行排序。

标签: c# arrays list sorting mergesort


【解决方案1】:

您可以简单地在元素列表中使用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) 没有打印产品的“详细信息”。当然,这是因为您最终在对象上使用了 .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);
}

【讨论】:

  • 谢谢,这有帮助。我怎样才能将列表的值写入控制台?例如,如果我尝试 foreach (var a in products) Console.WriteLine(a) 我得到 namespace.Product
  • 我已经为你扩展了你的问题;)
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 2014-12-11
  • 2012-11-02
  • 2020-08-23
  • 2021-06-18
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多