如何在列表上进行自定义排序

时间:2010-11-26 09:41:42

标签: .net sorting

我有一个由以下元素组成的列表

<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的属性,其中包含我尝试排序的值。

3 个答案:

答案 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)));