9

List [MyObject]を使用して、オブジェクト全体ではなくプロパティを比較したいと思います。したがって、IEquatable [MyObject]を使用しますが、コンパイラは文字列プロパティの代わりにMyObjectを必要とします。なんで?

これが私が得たものです:

public class AnyClass
{
    public List<AnyOtherClass> MyProperty { get; set; }        
    public string AnyProperty { get; set; }

    public AnyClass(string[] Names, string[] Values, string AnyProperty)
    {
        this.AnyProperty = AnyProperty;
        this.MyProperty = new List<AnyOtherClass>();
        for (int i = 0; i < Names.Length; i++)
            MyProperty.Add(new AnyOtherClass(Names[i], Values[i]));
    }
}

public class AnyOtherClass : IEquatable<string>
{
    public AnyOtherClass(string Name, string Values)
    {
        this.Name = Name;
        this.Values = Values.Split(';').ToList();
    }

    public string Name { get; set; }
    public List<string> Values { get; set; }

    public bool Equals(string other)
    {
        return this.Name.Equals(other);
    }
}

    private void DoSomething()
    {
        string[] Names = new string[] { "Name1", "Name2" };
        string[] Values = new string[] { "Value1_1;Value1_2", "Value2" };
        AnyClass ac = new AnyClass(Names, Values, "any Property");

        if (ac.MyProperty.Contains("Name1")) //Problem is here...
            //do something
    }
4

5 に答える 5

22

あなたはこれを使ってみたくなるかもしれません:

myList.Any(x => x.someProperty == someValue);

MSDNから:http://msdn.microsoft.com/en-us/library/bb534972.aspx

シーケンスのいずれかの要素が条件を満たすかどうかを判別します。

あなたが知らなかった場合に備えて、これx => x.someProperty == someValueはと呼ばれます。lambda expression

また、これを実装するものなら何でも使用できることに注意してください。これIEnumerableにより、に制限されることはありませんList<T>

于 2012-12-03T14:39:00.890 に答える
4

Whereではなく、やるべきだと思われますContains

string value = "test";
ac.Where(ac => ac.Name1 == value || ac.Name2 == value);

ac.MyProperty.Contains("Name1")爆破する理由MyPropertyList<AnyOtherClass>string

于 2012-12-03T14:35:31.493 に答える
3

すべきではありIEquatable<AnyOtherClass>ません<string>。比較が実際にはクラス内の文字列を比較しているにもかかわらず、のインスタンスではAnyOtherClassないインスタンスを比較しています。String

しかし、あなたがやろうとしていることは、ある種の辞書を作ることのように見えます。その場合、辞書クラスを使用する必要があります。

于 2012-12-03T14:40:16.290 に答える
2

これは、IEquatable<T>の使用目的ではありません。ドキュメントhttp://msdn.microsoft.com/en-us/library/ms131187.aspxを見てください:

実装者への注意事項IEquatable<T>インターフェイスのtypeパラメータを、このインターフェイスを実装しているタイプに置き換えます。

そのように機能するように設計されていないことに加えて、別のクラスにはインスタンスの検索に関する特定の要件があるため、なぜクラスにequalsの実装を強制するのでしょうか。他の回答で説明されているように、キーベースのルックアップを実行するには、コレクションを保持しているクラスに任せてください。

于 2012-12-03T14:52:29.993 に答える
0

これは私にとってチャンピオンのように機能しました!

"" "

public class Point : IComparable<Point>, IEquatable<Point>
{
    public DateTime x;
    public double y;
    public uint z;

    public Point(DateTime dateTime, double rate, uint sequence)
    {
        x = dateTime;
        y = rate;
        z = sequence;
    }

    public int Compare(Point a, Point b)
    {
        // Equal.
        if (a.z == b.z)
        {
            return 0;
        }
        // Less than.
        else
        if ((a.z < b.z))
        {
            return -1;
        }
        // Greater than.
        else
        {
            return 1;
        }
    }

    public int CompareTo(Point point)
    {
        return Compare(this, point);
    }

    public static int operator- (Point a, Point b)
    {
        return (int)(a.z - b.z);
    }

    public bool Equals(Point point)
    {
        return z == point.z;
    }
}

"" "

于 2019-11-12T19:45:39.870 に答える