3

以下に、withとプロパティlのリストを含むリストを示します。リストは、 ICompararを実装する次のクラスでアルファベット順に並べ替えることができます。ProductNamePriceProductNameComparer

List<Product> l = p.GetList();
l.Sort(new ProductNameComparer());
MessageBox.Show(l[0].Name);

public class ProductNameComparer : IComparer<Product>
{
    public int Compare(Product x, Product y)
    {
        return x.Name.CompareTo(y.Name);
    }
}

リストがどのようにソートされているのかわかりません。MSDN によると、ゼロ未満ゼロ、またはゼロより大きいInt32タイプの値をCompareTo返します。私が持っている場合:

string c = "Apple";
string d = "Orange";
return c.CompareTo(d)

関数は「-1」を返します。

しかし、コードl.Sort(-1)の代わりに置き換えるとl.Sort(new ProductNameComparer())コンパイルされません

また、なぜCompare(Product x, Product y)2つの製品だけを引数として取り、それでも製品のリスト(> 2)を比較およびソートすることができたのでしょうか。

4

3 に答える 3

10

このSortメソッドは 1 回だけではなくCompare、2 つの項目を比較する必要があるたびに複数回呼び出します。これは、任意の 2 つの項目を一貫した方法で比較できる限り、項目の任意のコレクションを並べ替えることができる一般的な並べ替えアルゴリズムです。

l.Sort(-1)整数を渡そうとしているだけなので、呼び出そうとしてもコードはコンパイルされません- それはどういう意味ですか?

Sortメソッドに1 つの比較結果を与えるのではなく、必要なアイテムを比較できるようにすることを理解する必要があります。

于 2011-12-16T07:29:04.410 に答える
7

デモンストレーションの目的で、Sort メソッドの可能な実装を次に示します (非常に非効率的な方法であることはわかっています)。

public void Sort(System.Collections.Generic.IComparer<T> comparer)
{
    for (int i = 0; i < this.Count - 1; i++)
    {
        for (int j = i + 1; j < this.Count; j++)
        {
            if (comparer.Compare(this[i], this[j]) > 0)
            {
                T tmp = this[i];
                this[i] = this[j];
                this[j] = tmp;
            }
        }
    }
}
于 2011-12-16T07:46:13.137 に答える
1

例 ( ) で使用されている Sort メソッドのオーバーロードには、 IComparerインターフェイスnew ProductNameComparer()を実装するためのパラメーターが必要です。int はこのインターフェイスを実装していないため、呼び出しは機能しません。@JonSkeet に従って、呼び出しの結果はソート戦略によって使用され、リストを並べ替えます。Sort(-1)CompareTo()

于 2011-12-16T07:40:36.097 に答える