8

このスニペットをWebサイトから削除したところ、特定の問題に必要な解決策であることがわかりました。

私はそれが何であるか(特にデリゲートとリターンの部分)がわかりません、そしてソースはそれを説明していません。

SOが私を啓発できることを願っています。

myList.Sort(  delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
              { 
                return x.Value.CompareTo(y.Value); 
              }
            );
4

6 に答える 6

11

MyList.Sortには、アイテムの比較を担当する関数という1つのパラメーターがあるため、リストをそれに応じて並べ替えることができます。

次へ:delegate(x、y)は、 KeyValuePair [String、Int32]タイプの2つのパラメーターを受け入れる関数自体を定義します。

括弧{...}の内容は、実際の比較ロジックです。

return x.Value.CompareTo(y.Value);

これは、この定義に従って2つの整数値を比較します。

したがって、リストはこれらの整数の値に基づいて昇順で並べ替えられます。


C#3.5では、次のように書き直します。

mylist.Sort((x,y) => x.Value.CompareTo(y.Value));
于 2009-11-20T05:02:25.653 に答える
0

これはリストで呼び出されるソート関数であり、リストに渡されるのは、2つの要素間の比較を実際に行うためにSort()によって呼び出されるデリゲートです。

関数のMSDNページ http://msdn.microsoft.com/en-us/library/0e743hdt.aspx

于 2009-11-20T04:57:47.600 に答える
0
myList.Sort //Sort using a your own compare function
  (
    // declare the compare function, returns a int, and receives two items
    delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
    {
        // returns a int indicating whether the items are "equal" - equal being what is implemented it the appropriate compare function.
        return x.Value.CompareTo(y.Value);
    }
  );
于 2009-11-20T05:03:02.173 に答える
0

このように考えてください。次のようなメソッドがあったとします。

public int MyComparisonMethod(KeyValuePair<string, int> x, KeyValuePair<string,int> y)
{
   return x.Value.CompareTo(y.Value);
}

これは基本的に2つの値を取り、それらを比較します。xがyより小さいか、等しいか、大きいかに応じて、それぞれ-1、0、または1を返します。

さて、秘密裏に、List.Sortはクイックソートアルゴリズムを使用しました。あなたが理解する必要があるのは、それがあなたのリストの様々な要素を互いに比較し続けるということです。値aが値bより大きいか、小さいか、または等しいかどうかをどのように知るのですか?このメソッドを呼び出し、それに基づいて認識します。意味がありますか?

つまり、リスト内の2つの値を比較するためのメカニズムであるList.Sortを使用して、ソートに必要な比較を行うという考え方です。

于 2009-11-20T05:06:26.987 に答える
0

参考までに、

これは、カスタムクラスのリストを並べ替える必要がある場合によく使用されます。

例えば

class Student
{
    int rollID;
    string name;
}

List<Student> students = new List<Student>();

...

students.Sort(delegate(Student x, Student y) { return x.rollID.CompareTo(y.rollID);});
于 2009-11-20T05:30:28.623 に答える
0

これは暗黙的ですが、「myList」の宣言について言及する必要があるかもしれません。あなたのためにそれを書かせてください。

var myList=new List<KeyValuePair<string, int>>();

つまり、このリストの各項目はKeyValuePair [string、int]のインスタンスであるということです。

さて、あなたの質問に来ます。

Sortメソッドのオーバーロードの1つは、コレクションの2つの項目を受け取り、整数を返す「比較」デリゲートを受け入れます。

public delegate int Comparison<T>(T x, T y)

基本的に、あなたがしているのは、IComparableの「CompareTo」メソッドを使用して2つのアイテムを比較する匿名のデリゲートを作成することです(この場合、「Value」でソートし、「Key」でソートすることもできます)(stringとintはこれを実装します)インターフェース)。

IComparable.CompareToは、lhsが(-1)未満、(1)より大きい、または(0)rhsに等しいことを示す整数(Sortメソッドによってリスト内のアイテムを配置するために使用されます)を返します。

参考:C#3.0で作業している場合は、匿名のデリゲートも必要ありません。代わりにラムダ式を使用できます(匿名デリゲートを定義するための省略形です、もっと?

例えば:

myList.Sort((x, y) => x.Value.CompareTo(y.Value));
//Sort over Value

myList.Sort((x, y) => x.Key.CompareTo(y.Key));
//Sort over key

説明がお役に立てば幸いです。

于 2009-11-20T06:07:19.920 に答える