【问题标题】:Howto override List<T> Contains如何覆盖 List<T> 包含
【发布时间】:2012-11-21 01:06:08
【问题描述】:

我想使用 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
    }

【问题讨论】:

    标签: c# generics contains iequatable


    【解决方案1】:

    这对我来说就像一个冠军!

    """

    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;
        }
    }
    

    """

    【讨论】:

      【解决方案2】:

      你可能想试试这个:

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

      来自 MSDN:http://msdn.microsoft.com/en-us/library/bb534972.aspx

      确定序列的任何元素是否满足条件。

      x =&gt; x.someProperty == someValue 被称为lambda expression,以防你不知道。

      请注意,您可以在任何实现 IEnumerable 的东西上使用它,所以这不会限制您使用 List&lt;T&gt;

      【讨论】:

      • 我正要发布这个。 Any 将在找到第一个匹配项时停止评估,而 Where 将继续获取完整列表(并且可能需要更长的时间才能运行)。
      • 好的,我会在这里使用 LINQ。
      【解决方案3】:

      这不是 IEquatable 的预期用途。看文档http://msdn.microsoft.com/en-us/library/ms131187.aspx

      实施者须知 将 IEquatable 接口的类型参数替换为实现该接口的类型。

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

      【讨论】:

        【解决方案4】:

        听起来你应该使用Where 而不是Contains

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

        ac.MyProperty.Contains("Name1") 爆炸的原因是因为MyPropertyList&lt;AnyOtherClass&gt; 而不是string

        【讨论】:

        • 是的,LINQ 在这里工作,但我还是不明白为什么 IEquatable 不能工作。
        • +1 只是因为 听起来你应该做 Where 而不是 Contains 句子对我帮助很大!
        【解决方案5】:

        应该是IEquatable&lt;AnyOtherClass&gt; 而不是&lt;string&gt;。您正在比较 AnyOtherClass 的实例而不是 String 的实例,尽管您的比较实际上是在比较您的类中的字符串。

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

        【讨论】:

        • 但我确实想将一个字符串与我班级的一个属性进行比较。我没有要比较的整个对象。
        • @UNeverNo:这不是IEquatable 接口的用途。它用于比较 same 类型的对象。正如我之前所说,听起来您真正要寻找的不是List&lt;AnyOtherClass&gt;,而是Dictionary&lt;string,AnyOtherClass&gt;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2010-10-09
        • 2012-08-23
        • 2016-03-16
        • 2018-07-20
        • 1970-01-01
        • 2021-08-25
        相关资源
        最近更新 更多