是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?
Posted
技术标签:
【中文标题】是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?【英文标题】:Is it possible to sort arrays based on multiple criteria using merge sort (C#)? 【发布时间】:2020-08-23 03:37:48 【问题描述】:假设我在控制台应用程序中获得以下输入行:
A 10 20 30
B 5 10 40
C 40 10 20
D 30 25 10
字母代表产品名称、第二价值价格、第三产品分数和第四产品耐力。我想首先根据价格对这个列表进行排序。如果两个产品的价格相同,则根据产品分数进行排序。如果两个产品的价格和产品分数相同,我想按产品耐用性排序,最后按名称排序。这可以使用归并排序吗?如果是这样,我应该如何解决这个问题?我无法将所有这些值存储到一个数组中并将其传递给合并排序算法,因此我必须创建多个数组。但是我如何跟踪数组的哪些值属于一起呢?我想在 C# 中执行此操作。
【问题讨论】:
我无法将所有这些值存储到一个数组中并将其传递给归并排序算法 为什么不能创建这样的数组?这是对此类数据进行排序的最方便的方法。首先,您应该创建一个类来保存每一行的所有值。然后为这个类定义比较器。最后使用标准库使用创建的比较器对对象数组进行排序。 【参考方案1】:您可以简单地在元素列表中使用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(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 我已经为你扩展了你的问题;)以上是关于是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章