我发现了很多帖子,但未能将它们与我的案例相匹配。
我在列表中有一些字符串
List<string> list = new List<string>{ "100-1", "100-11", "100-3", "100-20" }
我使用以下代码对从this location
中挑选的内容进行排序void Main()
{
string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{
Console.WriteLine(thing);
}
}
public class SemiNumericComparer: IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsNumeric(s1) && IsNumeric(s2))
{
if (Convert.ToInt32(s1) > Convert.ToInt32(s2)) return 1;
if (Convert.ToInt32(s1) < Convert.ToInt32(s2)) return -1;
if (Convert.ToInt32(s1) == Convert.ToInt32(s2)) return 0;
}
if (IsNumeric(s1) && !IsNumeric(s2))
return -1;
if (!IsNumeric(s1) && IsNumeric(s2))
return 1;
return string.Compare(s1, s2, true);
}
public static bool IsNumeric(object value)
{
try {
int i = Convert.ToInt32(value.ToString());
return true;
}
catch (FormatException) {
return false;
}
}
}
我的输出是100-1, 100-11, 100-20, 100-3
我认为将-
作为decimal
并比较这些值。实际上我期待结果
100-1, 100-3, 100-11, 100-20
。
我只是想知道它实际执行排序的基础。任何帮助表示赞赏。即使我希望它能以不同的方式对待100-2
和100-20
。
在飞行中,我已经在Infragistic控制网格中看到,在其中进行排序会产生与我期望的结果相同的结果。
修改
我在列表中有很多其他字符串值,有些是整数,双精度等等。连字号只是这里提到的一个案例。
答案 0 :(得分:4)
var sorted = things.Select(s => s.Split('-'))
.OrderBy(x => double.Parse(x[0]))
.ThenBy(x => double.Parse(x[1]))
.Select(x=>String.Join("-",x))
.ToList();
答案 1 :(得分:2)
这应该按预期工作:
string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
IEnumerable<string> ordered = things
.Select(s => new
{
str = s,
firstPart = s.Split('-').ElementAtOrDefault(0),
secondPart = s.Split('-').ElementAtOrDefault(1)
})
.OrderBy(x => int.Parse(x.firstPart))
.ThenBy(x => int.Parse(x.firstPart))
.Select(x => x.str);
foreach (string s in ordered)
Console.WriteLine(s);
虽然它假设您的数据是严格的,否则您可以在int.Parse(x.firstPart)
处开启例外情况。
答案 2 :(得分:1)
如果要按第二个数字(连字符后)对项目进行排序,则需要将字符串解析为数字,然后使用它进行排序。你可以尝试:
string[] things = new string[] { "100-1", "100-11", "100-3", "100-20" };
var test = things.OrderBy(r => int.Parse(r.Split('-')[1])).ToArray();
您当前代码无法正常工作的原因可能是由于它无法将字符串100-
解析为整数值而您的函数IsNumeric
返回false。