2

現在、リストに含まれるオブジェクト タイプの「CompareTo」メソッドを使用して、C# リストを並べ替えています。すべてのアイテムを WBS (Work Breakdown Structure) で昇順に並べ替えたいのですが、次のコードを使用してこれをうまく管理できます。

        public int CompareTo(DisplayItemsEntity other)
        {
            string[] instanceWbsArray = this.WBS.Split('.');
            string[] otherWbsArray = other.WBS.Split('.');

            int result = 0;

            for (int i = 0; i < maxLenght; i++)
            {
                if (instanceWbsArray[i].Equals(otherWbsArray[i]))
                {
                    continue;
                }
                else
                {    
                    result = Int32.Parse(instanceWbsArray[i]).CompareTo(Int32.Parse(otherWbsArray[i]));
                    break;
                }
            }
            return result;
        }

ここで、WBS となる 2 番目のパラメーターを検討する前に、プロジェクト名のアルファベット順のように、複数のパラメーターを考慮してソートできるようにしたいと考えています。これどうやってするの?

4

4 に答える 4

9

あなたのクラスの詳細がわからないので、文字列のリストと LINQ を使用した例を示します。OrderBy文字列をアルファベット順に並べ替え、ThenBy後で長さ順に並べます。このサンプルは、必要に応じて簡単に調整できます。

var list = new List<string>
{
    "Foo",
    "Bar",
    "Foobar"
};
var sortedList = list.OrderBy(i => i).
    ThenBy(i => i.Length).
    ToList();
于 2013-01-04T16:41:50.940 に答える
3

あなたのような場合に私たちが通常行うことは次のとおりです。

public int CompareTo( SomeClass other )
{
    int result = this.SomeProperty.CompareTo( other.SomeProperty );
    if( result != 0 )
        return result;
    result = this.AnotherProperty.CompareTo( other.AnotherProperty );
    if( result != 0 )
        return result;
    [...]
    return result;
}

PS コードを投稿するときは、質問に関連するコードのみを含めるようにしてください。あなたが投稿したコードには、読む必要のないものがたくさんあり、実際に目が痛くなりました。

于 2013-01-04T16:44:55.293 に答える
2

柔軟性があるのでイブの答えが好きですが、カスタムIComparer<T>インスタンスの作成について誰も言及していないことにちょっと驚いています

IComparer<T>型の 2 つのインスタンスを比較するためのメソッドを定義するジェネリック インターフェイスですT。を使用する利点は、IComparer<T>一般的に使用する並べ替え順序ごとに実装を作成し、必要に応じてこれらを使用できることです。これにより、typesCompareTo()メソッドでデフォルトの並べ替え順序を作成し、別の順序を個別に定義できます。

例えば

public class MyComparer
 : IComparer<YourType>
{
  public int Compare(YourType x, YourType y)
  {
     //Add your comparison logic here
  }
}

IComparer<T>プロパティの型で動作する別の比較子を使用して、特定の型のいくつかのプロパティを比較する比較子を使用できるような構成に特に役立ちます。

また、制御していない型の並べ替えを定義する必要がある場合にも非常に役立ちます。もう 1 つの利点は、LINQ を必要としないため、古いコード (.Net 2.0 以降) で使用できることです。

于 2013-01-04T16:55:02.993 に答える
0

最初にプロジェクト名をアルファベット順に比較し、等しくない場合は値を返し、そうでない場合は 2 番目の値に基づいて比較を実行します

    public int CompareTo(DisplayItemsEntity other)
    {
       if(other.ProjectName.CompareTo(this.ProjectName) != 0)
       {
           return other.ProjectName.CompareTo(this.ProjectName)
       }

       //else do the second comparison and return


       return result;
    }
于 2013-01-04T16:43:22.267 に答える