我有返回到 UI 的车牌号,我希望它们按升序排列:
假设输入如下:
1/12/13/2
1/12/11/3
1/12/12/2
1/12/12/1
我的预期输出是:
1/12/11/3
1/12/12/1
1/12/12/2
1/12/13/2
我目前正在执行此操作的代码是:
var orderedData = allLicenceNumbers
.OrderBy(x => x.LicenceNumber.Length)
.ThenBy(x => x.LicenceNumber)
.ToList();
但是对于另一个输入示例如下:
4/032/004/2
4/032/004/9
4/032/004/3/A
4/032/004/3/B
4/032/004/11
我正在获取返回的数据:
4/032/004/2
4/032/004/9
4/032/004/11
4/032/004/3/A
4/032/004/3/B
当我需要的是:
4/032/004/2
4/032/004/3/A
4/032/004/3/B
4/032/004/9
4/032/004/11
有没有更好的方法我可以简单地订购它以在两个样本输入中给出正确的结果,或者我是否需要编写自定义排序?
编辑
它不会始终是字符串中的相同元素。
这可能是示例输入:
2/3/5/1/A
1/4/6/7
1/3/8/9/B
1/3/8/9/A
1/5/6/7
预期输出为:
1/3/8/9/A
1/3/8/9/B
1/4/6/7
1/5/6/7
2/3/5/1/A
最佳答案
您应该拆分您的数字并将每个部分相互比较。按值比较数字和按字典顺序比较字符串。
var licenceNumbers = new[]
{
"4/032/004/2",
"4/032/004/9",
"4/032/004/3",
"4/032/004/3/A",
"4/032/004/3/B",
"4/032/004/11"
};
var ordered = licenceNumbers
.Select(n => n.Split(new[] { '/' }))
.OrderBy(t => t, new LicenceNumberComparer())
.Select(t => String.Join("/", t));
使用以下比较器:
public class LicenceNumberComparer: IComparer<string[]>
{
public int Compare(string[] a, string[] b)
{
var len = Math.Min(a.Length, b.Length);
for(var i = 0; i < len; i++)
{
var aIsNum = int.TryParse(a[i], out int aNum);
var bIsNum = int.TryParse(b[i], out int bNum);
if (aIsNum && bIsNum)
{
if (aNum != bNum)
{
return aNum - bNum;
}
}
else
{
var strCompare = String.Compare(a[i], b[i]);
if (strCompare != 0)
{
return strCompare;
}
}
}
return a.Length - b.Length;
}
}
关于c# 对不同格式的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47532158/