2010-06-02 4 views
4

Если у меня есть объект типа MyBull и List<MyBull> orig:List.Contains не работает, как ожидалось

// Just an example 
MyBull x = getMeTheObjectWithIdFromDB(9); 

orig.add(x); 

// Again same? data object 
MyBull y = getMeTheObjectWithIdFromDB(9); 

Почему это ложь, то?

// This is false, even though all the properties 
// of x and y are the same. 
orig.Contains<MyBull>(y); 

ответ

23

По умолчанию объекты будут подвергать основанию на основе ссылок. Если вам нужны пользовательские правила, такие как равенство на основе полей id, вам необходимо переопределить методы Equals и GetHashCode.

+0

Этот ответ забил мне еще один момент в моей «ответ-AC# -question-на-давая-a- Java-ответ "игра! :) Хотя у меня мало опыта C#, внутренний разработчик Java мгновенно выпалил: «Он забыл реализовать« equals() »и« hashCode() '!» ;) –

3

Включает ли ваш объект MyBull IEquatable<T>.Equals? Этот метод определяет равенство двух объектов

запрошенных OP

Ваш класс MyBull будет осуществлять IEquatable

public class MyBull : IEquatable<MyBull> 

, а затем вам нужно будет, чтобы переопределить Equals методу

public bool Equals(MyBull theOtherMyBull) 

Как упоминает Дэвид Нил ниже, это лучше всего использовать, когда вы сравниваете объект s того же типа, которыми вы являетесь. Переопределение объектов.Equals и Object.GetHashCode тоже будет работать.

+0

Из MSDN (IEquatable .Equals Method) - Указывает, равен ли текущий объект другому объекту того же типа. http://msdn.microsoft.com/en-us/library/ms131190.aspx –

+0

Похоже, это то, что требуется - с использованием общего списка . @David Neale: извините, неправильно прочитайте свой комментарий. Это просто разъяснение моего замечания о «равенстве двух объектов», –

4

Это потому, что экземпляры MyBull сравниваются по ссылке. С точки зрения .NET, x и y являются разными экземплярами и поэтому не равны.

Чтобы обойти это, вам понадобится override the Equals and GetHashCode methods (это означает, что вы должны, вероятно, реализовать IEquatable<MyBull> и переопределить операторы == и! =).

8

Если вы можете использовать LINQ, то вы можете

class Vessel 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

...

var vessels = new List<Vessel>() { new Vessel() { id = 4711, name = "Millennium Falcon" } }; 

var ship = new Vessel { id = 4711, name = "Millencolin" }; 

if (vessels.Any(vessel => vessel.id == ship.id)) 
    Console.Write("There can be only one!"); 
Смежные вопросы