20

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

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

私は何が欠けていますか?

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

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

Microsoftリファレンス

4

6 に答える 6

50

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

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

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

于 2008-10-23T17:23:10.570 に答える
10

Sort は二項述語を取らず、 notComparison<T>を返すデリゲートを取ります。intbool

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

于 2008-10-23T17:20:11.577 に答える
3

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

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

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

于 2008-10-23T18:18:00.570 に答える
1

obj.Sort(delegate(...)); のやり方 一箇所での動的ソートです。同じ並べ替えを行う場所が複数ある場合、またはより柔軟な並べ替えが必要な場合は、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));
于 2008-10-23T19:49:26.813 に答える
0

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

于 2008-10-23T18:04:07.697 に答える
0

以前の投稿で申し訳ありません。エディターは < および > 文字を取りません。また、エディターのすぐ下にあるプレビューに気づきませんでした。ID プロパティがオブジェクト型の場合、オブジェクトは IComparer または IComparer<T> を実装する必要があります。

于 2008-10-23T18:08:52.133 に答える