我有一个由以下元素组成的列表
<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的属性,其中包含我尝试排序的值。
答案 0 :(得分:0)
您可以使用正则表达式过滤掉非数字字符,然后比较:
_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));
});
答案 1 :(得分:0)
似乎,词汇排序不能满足您需要的唯一情况是比较“&lt;”有一个数字。所以,以下内容应该足够了:
return ((a1.Dimension1.StartsWith("<") && !a2.Dimension1.StartsWith("<"))
? -1 : a1.Dimension1.CompareTo(a2.Dimension1));
答案 2 :(得分:0)
var trimChars = new[] { '<', '>' };
_data.Sort((a1, a2) =>
a1.Dimension1.TrimStart(trimChars)
.CompareTo(a2.Dimension1.TrimStart(trimChars)));