如何覆盖List <t>包含</t>

时间:2012-12-03 14:34:29

标签: c# generics contains iequatable

我想使用List [MyObject]比较属性而不是整个对象。因此我使用IEquatable [MyObject],但编译器仍然需要MyObject而不是string属性。为什么呢?

这是我得到的:

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
    }

5 个答案:

答案 0 :(得分:20)

您可能想尝试使用它:

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>

答案 1 :(得分:4)

听起来你应该做Where而不是Contains

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

ac.MyProperty.Contains("Name1")爆炸的原因是因为MyPropertyList<AnyOtherClass>而不是string

答案 2 :(得分:3)

应该{​​{1}}而不是IEquatable<AnyOtherClass>。您正在比较<string>不是AnyOtherClass实例的实例,尽管您的比较实际上是在比较您班级中的字符串。

但它看起来更像是你要做的是做一些字典。在这种情况下,您应该使用字典类。

答案 3 :(得分:2)

这不是IEquatable&lt; T&gt;的预期用法。查看文档http://msdn.microsoft.com/en-us/library/ms131187.aspx

对实施者的说明 替换IEquatable&lt; T&gt;的类型参数。接口与实现此接口的类型。

除了不是那样设计工作之外,为什么要强制在类上实现equals,因为另一个类对查找实例有特定的要求?将其留给持有集合的类来执行基于键的查找,如其他答案中所述。

答案 4 :(得分: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;
    }
}

“”“