【发布时间】:2022-11-13 14:56:06
【问题描述】:
我有一个List<string> 的数组列表,其中包含按以下顺序排列的值["1m", "1cm", "4km","2cm"](厘米、米和公里)
当我想对这个数组进行排序时,我得到了错误的答案。我使用 OrderBy:
List<string> data = new List<string> { "1m", "1cm", "4km","2cm" };
var result= data.OrderBy(x => x).ToList();
结果是:
{ "1cm", "1m", "2cm", "4km"}
但我希望答案是这个顺序-:{ "1cm", "2cm", "1m", "4km"}
【问题讨论】:
-
这按字母顺序排序。 .NET 不知道测量单位,您必须自己转换它们,例如通过将每个长度都带到毫米。
-
这是因为 C# 不了解您的字符串包含的内容。它将按字母顺序排序。如果您需要在排序中添加逻辑,我建议首先实现一个包含“解析”方法的“长度”结构,然后深入 IComparable 接口以添加排序
-
2.5m和2m50cm呢?有这么多的问题,你还没有尝试过。很明显,.NET 无法神奇地理解您的排序逻辑。
-
您可能可以创建某种包含
value字段的类或结构(以保存距离的数值(以您想要的任何单位和display字段)(保存您要显示的字符串版本。您必须将display字段解析为数字value字段。然后您可以创建一个List<yourClass>并根据value对其进行排序,然后打印display字段。 -
OrderBy 有一个重载,它接受一个实现 IComparer 接口的类的实例。您应该编写这样的类,它能够实现将字符串 m km cm 和基本度量单位中的其他内容转换的逻辑,然后返回比较的逻辑结果。