我有一个由以下元素组成的列表
<1, 2-3, 4-5, >6当我对它进行排序时,我得到
<1,>6,2-3,4-5但希望以正确的顺序得到它。
我编写了这个代码,它工作正常,但我发现它非常冗长,我希望将它减少到2,3行代码
_data.Sort(delegate(SourceEntity a1, SourceEntity a2)
{
if (a1.Dimension1.StartsWith("<") && a2.Dimension1.StartsWith("<")) return 0;
else if (a1.Dimension1.StartsWith(">") && a2.Dimension1.StartsWith(">")) return 0;
else if (a1.Dimension1.StartsWith("<") && a2.Dimension1.StartsWith(">")) return -1;
else if (a1.Dimension1.StartsWith(">") && a2.Dimension1.StartsWith("<")) return 1;
else if (a1.Dimension1.StartsWith("<")) return -1;
else if (a1.Dimension1.StartsWith(">")) return 1;
else if (a2.Dimension1.StartsWith("<")) return 1;
else if (a2.Dimension1.StartsWith(">")) return -1;
else return a1.Dimension1.CompareTo(a2.Dimension1);
});SourceEntity包含一个名为Dimension1的属性,该属性包含我试图对其排序的值。
发布于 2010-11-26 21:21:44
可以使用正则表达式筛选出非数字字符,然后进行比较:
_data.Sort(delegate(SourceEntity a1, SourceEntity a2)
{
Regex nonNumericCharacters = new Regex(@"\D");
return nonNumericCharacters.Replace(a1.Dimension1, string.Empty).CompareTo(nonNumericCharacters.Replace(a2.Dimension1, String.Empty));
});发布于 2010-11-26 21:39:03
看起来,词法排序不能满足您的需要的唯一情况是将"<“与一个数字进行比较。因此,以下内容应该足够了:
return ((a1.Dimension1.StartsWith("<") && !a2.Dimension1.StartsWith("<"))
? -1 : a1.Dimension1.CompareTo(a2.Dimension1));发布于 2010-11-28 01:24:49
var trimChars = new[] { '<', '>' };
_data.Sort((a1, a2) =>
a1.Dimension1.TrimStart(trimChars)
.CompareTo(a2.Dimension1.TrimStart(trimChars)));https://stackoverflow.com/questions/4284112
复制相似问题