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

自然順を検討することをお勧めします。

通常の並べ替え:

  • mapPart_1_1
  • mapPart_1_10
  • mapPart_1_2

自然順:

  • mapPart_1_1
  • mapPart_1_2
  • mapPart_1_10

C#で自然順を読むことができます。

于 2010-08-11T08:45:08.407 に答える
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

[チェック][1] この質問

必要なのは、カスタムIComparerを使用した 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

私が文字列に好む1行のソリューション!

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