デリゲートを使用してリストを並べ替えようとしていますが、署名の一致エラーが発生します。コンパイラは、「匿名メソッド」から変換できないと言っています
List<MyType> myList = GetMyList();
myList.Sort( delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); } );
何が足りないのですか?
これが私が見つけたいくつかの参考文献であり、それらは同じ方法でそれを行います。
私はあなたが欲しいと思います:
myList.Sort( delegate (MyType t1, MyType t2)
{ return (t1.ID.CompareTo(t2.ID)); }
);
並べ替えるには、「true/false」以外のものが必要です。それが等しいか、大きいか、小さいかを知る必要があります。
ソートはバイナリ述語を取りません。int
ではなくbool
を返すComparison<T>
デリゲートを取ります。
戻り値は、アイテムが等しい場合は0
、最初のアイテムが2番目よりも小さい場合は<0
、最初のアイテムが2番目よりも大きい場合は>0
です。
将来、このような問題をデバッグしたい場合は、次のように、Sort呼び出しからデリゲート定義を分割することをお勧めします。
Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
myList.Sort(c);
そうすれば、問題がメソッド呼び出しにあるのか、デリゲート定義にあるのかを確認できます。コードを読みやすくするために、このままにしておくことを好む人もいます(明らかに、「c」よりもわかりやすい名前を付けます)。私はそれを取るか、それを残すことができます=-)
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));
IDプロパティが、IntやStringなどのデフォルト値のデータ型であるかどうかを確認してください。 IDがオブジェクト参照型の場合、そのオブジェクトはIComparerまたはIComparerを実装する必要があります。
以前の投稿でごめんなさい。エディターは<と>の文字を取りません、そして私はエディターのすぐ下のプレビューに気づきませんでした。 IDプロパティがオブジェクトタイプの場合、オブジェクトはIComparerまたはIComparer <T>を実装する必要があります。