我有一个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"}
6条答案
按热度按时间dgtucam11#
您已经按字母顺序对数据进行了排序。首先比较
first character
。然后比较second character
和...您需要基于
cm(or m)
对数据进行规范化,然后进行排序。则
result
:{“1厘米”、“2厘米”、“1米”、“4公里”}
yk9xbfzb2#
fykwrbwg3#
如果可以,请先解析字符串:
。
这样你就可以按照
NormalizedLength
对你的测量值进行排序,而ToString
会返回原来的字符串。应该很快,很容易扩展新的单位,如果你把Parse
转换成TryParse
模式,你可以使它具有容错性。mkshixfv4#
有一个NuGet包可以管理解析和操作SI单位,称为
UnitsNet
。如果安装该软件包(通过添加|NuGet Package,搜索并选择
UnitsNet
并安装它),然后可以编写下面的代码:(You需要先在代码文件的顶部添加
using UnitsNet;
)这也适用于
nm
等。这将输出
"1cm, 2cm, 1m, 4km"
qojgxg4l5#
您需要使用IComparable自定义排序
fkvaft9z6#
不能使用OrderBy进行排序。
您必须首先定义从所有单位到最小单位的转换。例如,m到cm,km到cm.....
所以1m等于100 cm
那么你必须遍历你的列表,检查每一项的单位,得到它的最小单位。
创建另一个列表。
您可以实现插入排序来对项进行排序并添加基于比较的保持插入项。