我有以下问题 我有一个包含字符串的列表,例如(100_1,100_2 ......,100_10)
我使用以下代码对列表进行排序
extraImgsRaw.Sort((photo1, photo2) => photo1.CompareTo(photo2));
结果是:100_1,100_10,100_2,100_3等等
我想要的结果是逻辑比较,如100_1,100_2然后100_10所以我更喜欢a 自然数字排序不是字母排序。 我是否需要编写自己的实现ICompare接口的比较类,或者在LINQ中有一个构建方法可以做到这一点吗?
提前谢谢
答案 0 :(得分:4)
没有任何内置内容,但如果数据与您的问题中显示的完全一致,那么为您执行此操作可能不会太困难{<3}}:
extraImgsRaw.Sort((x, y) =>
{
// error checking etc removed for brevity
int[] xi = x.Split('_').Select(int.Parse).ToArray();
int[] yi = y.Split('_').Select(int.Parse).ToArray();
int c = xi[0].CompareTo(yi[0]);
return (c != 0) ? c : xi[1].CompareTo(yi[1]);
});
答案 1 :(得分:1)
拆分和比较元素,
这是我为'版本'写的一篇。
/// <summary>
/// Only works for version numbers in the form a ( . b ( . c ( . d )? )? )?
/// </summary>
public class VersionComponents : IComparable<VersionComponents>
{
readonly int[] components;
int[] GetComponents(string cpnumber)
{
var tokens = cpnumber.Split(".".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries);
return tokens.Select(x => Convert.ToInt32(x)).ToArray();
}
public VersionComponents(string cpnumber)
{
components = GetComponents(cpnumber);
}
public int this[int index]
{
get { return components.Length > index ? components[index] : 0; }
}
public int CompareTo(VersionComponents other)
{
for (int i = 0; i < components.Length ||
i < other.components.Length; i++)
{
var diff = this[i].CompareTo(other[i]);
if (diff != 0)
{
return diff;
}
}
return 0;
}
}