2009-11-20 8 views
8

私はちょうどウェブサイトからこのスニペットを解除し、私は私の特定の問題のために必要な解決策であることが証明されました。これはうまくいきました。正確に何ですか?

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

こんにちは、私を啓発することができます。

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

+1あなたが見つけた次のスニペットに移動するのではなく、何をしているのか理解したい。 –

+0

答えを受け入れることを忘れないでください。 –

答えて

11

MyList.Sortは一つのパラメータがある - アイテムを比較するための責任がある機能を、そのリストがそれにaccodingソートすることができます。

次へデリゲート(x、y)はKeyValuePair [文字列のInt32]の2つのパラメータを受け付ける関数自体を定義します。 this definitionに係る2つの整数値を比較

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

括弧{···}内のコンテンツは、実際comparissonロジックです。

したがって、あなたのリストは、その整数の値に基づいて昇順でソートされます。 C#3.5で


私はこのように書き換えます:

mylist.Sort((x,y) => x.Value.CompareTo(y.Value)); 
+0

C#3.0では、このコードを短縮できますか? – Chris

+0

はい。私は答えを更新しました。 –

+0

このフードの下には、このようなものがあると仮定しています: このリストの各keyvalueペアについて、 は、現在のkeyvaluepairの 'value'項目と次のkeyvaluepairの 'value'項目を比較します。より大きなものは、1つのスロットが他のスロットよりも高く配置されます。 - 私は閉じますか? – fieldingmellish

0

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

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

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); 
    } 
); 
+2

私はそれが実際に0を等しい、0より小さいx yの整数を返すと信じています – Davy8

+2

INT、NOT BOOLEANを返します! –

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より大きいか、値bより小さいか、等しいかどうかは、どのようにしてわかりますか?それはこのメソッドを呼び出し、それに基づいて、それは知っています。意味がありますか?

考えられるのは、リストの2つの値を比較するための仕組みを提供していることです。List.Sortはそれを使用してソートに必要な比較を行います。

0

ちょうどFYI、

これは一般的には、カスタムクラスのリストをソートする必要がある場合に使用されています。

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);}); 
0

これは暗黙的ですが、あなたの "myList"の宣言に言及している必要があります。 私はあなたのためにそれを書きましょう。

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

ここで、このリストの各項目は、KeyValuePair [string、int]のインスタンスであることを意味します。

今、あなたの質問にお答えください。

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

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

、何をやっていることの「のCompareTo」メソッドを使用して(あなたのケースでは、あなたが「キー」にしてもソート「値」にすることができ、ソートされている)は、2つの項目を比較して、匿名デリゲートを作成していますIComparable(stringおよびintはこのインターフェイスを実装します)。

IComparable.CompareToは、lhsが(-1)よりも小さく、より大きい(1)または(0)rhsであることを示すSortメソッドによって項目を配置するために使用される整数を返します。

FYI: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 

希望説明が便利です:あなたはたとえば、(more?匿名デリゲートを定義するための省略形です)

代わりに、ラムダ式を使用することができます。

関連する問題