0

カスタムの「ポイント」クラスのリストがあるとしましょう (System.Drawing にあることは知っていますが、カスタムのクラスが必要だとしましょう)。このリストには同じポイントが含まれている場合があるため、たとえば、次のように設定されているとします。

List<customPoint> myPoints = new List<customPoint>();
myPoints.Add(new customPoint(1,5));
myPoints.Add(new customPoint(1,5));
myPoints.Add(new customPoint(2,3));
myPoints.Add(new customPoint(4,9));
myPoints.Add(new customPoint(8,7));
myPoints.Add(new customPoint(2,3));

後で計算を行う必要がありますが、重複は必要ありません。これよりもユニークなポイントの新しいリストを作成するよりエレガントな方法は何でしょうか:

List<customPoint> uniquePoints = new List<customPoint>();

for(int i; i < myPoints.Count; i++)
{
    Boolean foundDuplicate = false;    

    int tempX = myPoints[i].X;
    int tempY = myPoints[i].Y;        

    for(int j=0; j < uniquePoints.Count; j++)
    {
        if((tempX == uniquePoints[0].X) && (tempY == uniquePoints[0].Y))
        {
            foundDuplicate = true;
            break;
        }            
    }
    if(!foundDuplicate)
    {
        uniquePoints.Add(myPoints[i]);
    }        
}

面倒なのはわかっていますが、それが、もっとエレガントな方法があるかどうかを尋ねている理由です。Linq の "Distinct" コマンドを調べましたが、機能していないようです。オブジェクトのインスタンス化には、まだ固有のものがあると思います。

4

4 に答える 4

1

動作しなかった LINQ を使用して試したことは何ですか? 以下のコードでそれを行う必要があります。

var uniquePoints = myPoints.Distinct();
于 2013-04-26T18:54:39.060 に答える
0

私はこれをLinqPadで行ったので、すみません...しかし、クラスDump()を実装する方法は次のとおりです。customPoint

void Main()
{
    var myPoints = new List<customPoint>();
    myPoints.Add(new customPoint(1,5));
    myPoints.Add(new customPoint(1,5));
    myPoints.Add(new customPoint(2,3));
    myPoints.Add(new customPoint(4,9));
    myPoints.Add(new customPoint(8,7));
    myPoints.Add(new customPoint(2,3));

    myPoints.Distinct().Dump();
}


public class customPoint {
    public int X;
    public int Y;

    public customPoint(int x, int y){
        X = x;
        Y = y;
    }

    public override Boolean Equals(Object rhs) {
        var theObj = rhs as customPoint;

        if(theObj==null) {
            return false;
        } else {
            return theObj.X == this.X && theObj.Y == this.Y;
        }
    }

    public override int GetHashCode() {
        return X ^ Y;
    }
}
于 2013-04-26T19:05:37.683 に答える