1

我如何按名称对列表中的对象进行排序?例子:

mapPart_1_0
mapPart_1_2
mapPart_1_4
mapPart_1_6
mapPart_1_8
mapPart_1_10
mapPart_1_12
mapPart_1_24
mapPart_2_1
mapPart_2_11
Big list continues... (somewhere in that list are missing that aper in sorted one)

进入:

mapPart_1_0
mapPart_1_1
mapPart_1_2
mapPart_1_3
mapPart_1_4
mapPart_1_5
...
mapPart_2_1
mapPart_2_2
mapPart_2_3
...
mapPart_2_11
...

或者我可以将对象名称更改为其他名称以便更容易缩短吗?

谢谢你。

4

6 回答 6

2

我认为你可以做这样的事情(未经测试)

var yourList= new List<YourObject>();
//add items to your list

yourList.Sort(delegate(YourObject p1, YourObject p2)
              {
                  //you can make this delegate more complex if you need it
                  return p1.Name.CompareTo(p2.Name);
              });
于 2010-08-11T08:47:12.707 回答
1

您可能要考虑自然排序

普通排序:

  • 地图Part_1_1
  • 地图Part_1_10
  • 地图Part_1_2

自然排序:

  • 地图Part_1_1
  • 地图Part_1_2
  • 地图Part_1_10

您可以阅读C# 中的自然排序

于 2010-08-11T08:45:08.407 回答
0

[检查][1] 这个问题

您需要的是带有自定义IComparer的 Sort 函数。您现在拥有的是使用 sort 时的默认 icomparer。这将检查字段值。

当您创建自定义 IComparer 时(您通过实现Icomparable接口在您的类中执行此操作)。它的作用是:您的对象会检查您排序列表中的每个其他对象。

这是由一个函数完成的。(不用担心 VS 在引用你的界面时会实现它

public class  ThisObjectCLass : IComparable{

    public int CompareTo(object obj) {
            ThisObjectCLass something = obj as ThisObjectCLass ;
            if (something!= null) 
                if(this.key.Split("_")[1].CompareTo(object.key.Split("_")[1]) == 0){
                // extratc the numbers from your name and compare the numbers, you have            to add some logic but I assume you know something about c#
                //then:
                   if .....
                }
                else if(this.key.Split("_")[1] "is more important then(use some logic here)" object.key.Split("_")[1]){
                 return 1
                }
                else return -1
            else
               throw new ArgumentException("I am a dumb little rabid, trying to compare different base classes");
        }
}

阅读上面的链接以获得更好的信息。

于 2010-08-11T08:41:45.127 回答
0

这涉及对您的要求的一些自由假设,并且是一种快速破解,但是......

var groups = myList.Select (text => 
new
 { 
  FirstNum = int.Parse(text.Split('_')[1]), 
  SecondNum = int.Parse(text.Split('_')[2])
 })
.GroupBy(a => a.FirstNum, a => a.SecondNum);


foreach(var group in groups.OrderBy(g => g.Key))
{
  int min = group.Min();
  int max = group.Max();

  for(int i=min; i<=max; i++)
    yield return string.Format ("mapPart_{0}_{1}", group.key, i);

}
于 2010-08-11T08:43:41.320 回答
0

假设您希望排序服从每个标记,看起来这可能是您想要的?老实说,我不确定你想要你的结果是什么......

class Program
{
    public class ObjectNameComparer : IComparer<object>
    {
        public int Compare(object x, object y)
        {
            var n1 = x.ToString().Split('_');
            var n2 = y.ToString().Split('_');
            var nameCompare = string.Compare(n1[0], n2[0], StringComparison.OrdinalIgnoreCase);
            if (nameCompare == 0)
            {
                var i1 = int.Parse(n1[1]);
                var i2 = int.Parse(n2[1]);
                if (i1 == i2)
                {
                    var i12 = int.Parse(n1[2]);
                    var i22 = int.Parse(n2[2]);
                    return i12 - i22;
                }
                return i1 - i2;
            }
            return nameCompare;
        }
    }

    static void Main(string[] args)
    {
        var objectList = new List<object>();

        objectList.AddRange(new object[]
            {
                "mapPart_1_0",
                "mapPart_1_10",
                "mapPart_100_10",
                "mapPart_1_12",
                "mapPart_22_11",
                "mapPart_1_24",
                "mapPart_2_1",
                "mapPart_10_24",
                "mapPart_2_11",
            });

        var ordered = objectList.OrderBy(a => a, new ObjectNameComparer());

    }
}
于 2010-08-11T08:56:08.147 回答
0

我更喜欢字符串的单行解决方案!

//Sort by Name: list = List<string>() ...
list.Sort((x, y) => String.Compare(x, y, StringComparison.Ordinal));
于 2013-12-13T08:33:25.203 回答