web-dev-qa-db-ja.com

デリゲートを使用したリストの並べ替えの問題

デリゲートを使用してリストを並べ替えようとしていますが、署名の一致エラーが発生します。コンパイラは、「匿名メソッド」から変換できないと言っています

List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );

何が足りないのですか?

これが私が見つけたいくつかの参考文献であり、それらは同じ方法でそれを行います。

開発者フュージョンリファレンス

Microsoftリファレンス

19
wusher

私はあなたが欲しいと思います:

myList.Sort( delegate (MyType t1, MyType t2) 
    { return (t1.ID.CompareTo(t2.ID)); } 
);

並べ替えるには、「true/false」以外のものが必要です。それが等しいか、大きいか、小さいかを知る必要があります。

49
cfeduke

ソートはバイナリ述語を取りません。intではなくboolを返すComparison<T>デリゲートを取ります。

戻り値は、アイテムが等しい場合は0、最初のアイテムが2番目よりも小さい場合は<0、最初のアイテムが2番目よりも大きい場合は>0です。

10
Jeff Yates

将来、このような問題をデバッグしたい場合は、次のように、Sort呼び出しからデリゲート定義を分割することをお勧めします。

Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
myList.Sort(c);

そうすれば、問題がメソッド呼び出しにあるのか、デリゲート定義にあるのかを確認できます。コードを読みやすくするために、このままにしておくことを好む人もいます(明らかに、「c」よりもわかりやすい名前を付けます)。私はそれを取るか、それを残すことができます=-)

3
Coderer

Obj.Sort(delegate(...));の方法1か所での動的ソートです。同じ並べ替えを行う場所が複数ある場合、またはより柔軟な並べ替えが必要な場合は、IComparer <T>を実装するクラスを作成することを検討してください。次に例を示します。

public class MyTypeComparer : IComparer<MyType>
{
  public MyTypeComparer() // default comparer on ID
  { ... }

  public MyTypeComparer(bool desc) // default with order specified

  public MyTypeComparer(string sort, bool desc) // specified sort and order such as property name, true or false.
  { ... }

  public int Compare(MyType a, MyType b) // implement IComparer interface
  { ... } // this is real sorting codes
}

これを使用する例を次に示します。

List<MyType> myList = GetList();
myList.Sort(new MyTypeComparer());
// myList.Sort(new MyTypeComparer(false));
// myList.Sort(new MyTypeComparer("FirstName", true));
0
David.Chu.ca

IDプロパティが、IntやStringなどのデフォルト値のデータ型であるかどうかを確認してください。 IDがオブジェクト参照型の場合、そのオブジェクトはIComparerまたはIComparerを実装する必要があります。

0
David.Chu.ca

以前の投稿でごめんなさい。エディターは<と>の文字を取りません、そして私はエディターのすぐ下のプレビューに気づきませんでした。 IDプロパティがオブジェクトタイプの場合、オブジェクトはIComparerまたはIComparer <T>を実装する必要があります。

0
David.Chu.ca