我想使用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
}
答案 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")
爆炸的原因是因为MyProperty
是List<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;
}
}
“”“