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