50

IComparerポイントのリストをソートするために を使用しようとしています。IComparer クラスは次のとおりです。

public class CoordinatesBasedComparer : IComparer
{
    public int Compare(Object q, Object r)
    {
        Point a = (p)q;
        Point b = (p)r;
        if ((a.x == b.x) && (a.y == b.y))
            return 0;
        if ((a.x < b.x) || ((a.x == b.x) && (a.y < b.y)))
            return -1;

        return 1;
    }
}

List<Point>クライアント コードでは、このクラスを使用してポイント p (タイプ)のリストを並べ替えようとしています。

CoordinatesBasedComparer c = new CoordinatesBasedComparer();
Points.Sort(c);

コードがエラーになります。IComparer<Point>どうやらsort メソッドの引数として期待されているようです。
これを修正するにはどうすればよいですか?

4

4 に答える 4

62

厳密に型指定されたインターフェイス ( MSDN )を実装する必要があります。

public class CoordinatesBasedComparer : IComparer<Point>
{
    public int Compare(Point a, Point b)
    {
        if ((a.x == b.x) && (a.y == b.y))
            return 0;
        if ((a.x < b.x) || ((a.x == b.x) && (a.y < b.y)))
            return -1;

        return 1;
    }
}

ところで、中かっこを使いすぎていると思います。中かっこは、コンパイラに貢献する場合にのみ使用する必要があると思います。これは私のバージョンです:

if (a.x == b.x && a.y == b.y)
    return 0;
if (a.x < b.x || (a.x == b.x && a.y < b.y))
    return -1;

を使っている人が嫌いなのと同じようにreturn (0)


.Net-3.5+ アプリケーションを対象とする場合は、LINQ を使用できることに注意してください。LINQ は、並べ替えにより簡単かつ高速になります。

LINQ バージョンは次のようになります。

var orderedList = Points.OrderBy(point => point.x)
                        .ThenBy(point => point.y)
                        .ToList();
于 2013-01-15T11:11:00.813 に答える
13
public class CoordinatesBasedComparer : IComparer, IComparer<Point>
{
    public int Compare(Point a, Point b)
    {
        if ((a.x == b.x) && (a.y == b.y))
            return 0;
        if ((a.x < b.x) || ((a.x == b.x) && (a.y < b.y)))
            return -1;

        return 1;
    }
    int IComparer.Compare(Object q, Object r)
    {
        return Compare((Point)q, (Point)r);            
    }
}
于 2013-01-15T11:11:36.273 に答える
0

InvalidOperationタイプのオブジェクトを に追加しているときにエラーが発生しましMyClassSortedList<MyClass>。私は間違って、IComparer インターフェイスを実装していました。私が実装する必要があったのは、ICompare.Compare(MyClass x, MyClass y) の代わりに、メソッド CompareTo(MyClass other) を使用した IComparable でした。これは簡単な例です:

SortedList<MyClass> sortedList = new SortedList<MyClass>();
MyClass a=new MyClass(), b=new MyClass();
sortedList.Add(a);
sortedList.Add(b); // Note, sort only happens once second element is added

これで修正されました

public class MyClass : IComparable<MyClass>
{
    int IComparable<MyClass>.CompareTo(MyClass other)
    {
        // DoCompareFunction(this, other); and return -1,0,1
    }
}

これは壊れていました ( に追加する場合はこれを行わないでくださいSortedList<MyClass>) :

public class MyClass : IComparer<MyClass>
{
    int IComparable<MyClass>.Compare(MyClass x, MyClass y)
    {
        // DoCompareFunction(x, y); and return -1,0,1
    }
}

これはエラーでした:

配列内の 2 つの要素を比較できませんでした。
System.Collections.Generic.ArraySortHelper`1.BinarySearch(T[] 配列、Int32 インデックス、Int32 長さ、T 値、IComparer`1 比較子)
で System.Array.BinarySearch[T](T[] 配列、Int32 インデックス、
System.Collections.Generic.SortedList`2.Add(TKey キー、TValue 値) での Int32 長さ、T 値、IComparer`1 比較子)

于 2017-06-10T12:09:50.433 に答える