1

I am having problem with List Object values. Object is an object of class which holding two integer number.

like

List<Object> container;
container.Add(new Coordinates(x_axis, y_axis));  // x_axis=200, y_axis=300

I have to add unique coordinates each time, means next time x_axis, y_axis can never be added to list if it is 200, 300 respectively.

How can I check the already exist item in list objects?

Thanks


You could cast the items you pull out of your container back to Coordinates, then check their x and y values. Or if it inherits from ICombparable, just use the = operator. If it isn't IComparable, you could make your own class, and inherit the IComerable Interface.

    var myCoord = (Coordinates) container(0);

This is all assuming you really don't want to make your container just hold the Coordinates directly.

Edit: Fixed a bunch of typos

4

5 に答える 5

3

List<Coordinates>代わりに使用してください。

座標のセットがリストに存在するかどうかを確認するには、リストをループしてプロパティ値を比較する必要があります。

Coordinates point = new Coordinates(200, 300);

if (!container.Any(c => c.x_axis == point.x_axis && c.y_axis = point.y_axis)) {
  container.Add(point);
}
于 2012-04-16T08:16:58.740 に答える
3

CoordinatesクラスのEqualsとGetHashCodeをオーバーライドします。

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

    public int X { get; private set; }
    public int Y { get; private set; }

    public override bool Equals(object obj)
    {
        if (!(obj is Coordinates))
        {
            return false;
        }
        Coordinates coordinates = (Coordinates)obj;
        return ((coordinates.X == this.X) && (coordinates.Y == this.Y));
    }

    public override int GetHashCode()
    {
        return (X ^ Y);
    }
}

そして、Coordinatesオブジェクトの汎用ListまたはHashSetを使用します。

List<Coordinates> container = new List<Coordinates>();
Coordinates coordinates = new Coordinates(x_axis, y_axis);

if (!container.Contains(coordinates)
    container.Add(coordinates);

そしてHashSetで:

HashSet<Coordinates> container = new HashSet<Coordinates>();
container.Add(new Coordinates(x_axis, y_axis));
于 2012-04-16T08:29:40.190 に答える
0

HashSetまたはDictionaryを使用して(特定の順序で保持する必要がある場合)、それらが本当に一意であることを確認することをお勧めします。

次に、 GetHashCodeEqualsをオーバーライドして、等しいかどうかを確認する必要があります。

GetHashCodeのベストプラクティス:オーバーライドされたSystem.Object.GetHashCodeの最良のアルゴリズムは何ですか?

実装

public class Coordinate
{
    public Int32 X { get; set; }
    public Int32 Y { get; set; }

    public override int GetHashCode()
    {
        Int32 hash = 17;
        hash = hash * 23 + X;
        hash = hash * 23 + Y;
        return hash;
    }
    public override Boolean Equals(object obj)
    {
        Coordinate other = obj as Coordinate;
        if (other != null)
        {
            return (other.X == X) && (other.Y == Y);
        }
        return false;
    }
}

辞書

Int32 count = 0;
Dictionary<Coordinate, Int32> cords = new Dictionary<Coordinate, Int32>();
// TODO : You need to check if the coordinate exists before adding it
cords.Add(new Coordinate() { X = 10, Y = 20 }, count++);
// To get the coordinates in the right order
var sortedOutput = cords.OrderBy(p => p.Value).Select(p => p.Key);

HashSet

HashSet<Coordinate> cords = new HashSet<Coordinate>();
cords.Add(new Coordinate() { X = 10, Y = 20 });
于 2012-04-16T08:29:22.047 に答える
0

You can use LINQ like this:

if (!container.Any(c => (Coordinates)c.x_axis == x_axis &&
                        (Coordinates)c.y_axis == y_axis))
    container.Add(new Coordinates(x_axis, y_axis));
于 2012-04-16T08:15:23.840 に答える
0

コンテナから取り出したアイテムを Coordinates にキャストし、x と y の値を確認できます。または、ICombparable から継承する場合は、= 演算子を使用します。IComparable でない場合は、独自のクラスを作成し、IComerable インターフェイスを継承できます。

    var myCoord = (Coordinates) container(0);

これはすべて、コンテナに座標を直接保持させたくないという前提です。

編集:タイプミスの束を修正

于 2012-04-16T08:13:10.620 に答える