Метод .Contains()
использует средство сравнения по умолчанию , что означает, что он вызывает метод .Equals()
для типа, чтобы найти совпадение.
Для ссылочных типов, таких как ваш класс Person
, метод по умолчанию, унаследованный от Object
, использует равенство ссылок , то есть он вернет true
, только если они точны тот же экземпляр объекта . Если вам нужен другой тип сравнения, вам следует перегрузить метод Equals()
в этом типе (и реализовать IEquatable<T>
и переопределить GetHashCode()
, пока вы в нем).
public class Person : IEquatable<Person>
{
public string Name {get; set;}
public int Age {get; set;}
public int Id {get; set;}
public bool Equals(Person other)
{
return other is Object && this.Id == other.Id;
}
public override bool Equals(Object other)
{
if (other is Person) return Equals((Person)other);
return false;
}
public override int GetHashCode()
{ //naive implementation. This is adequate as long as you're **SURE** all instances will have a unique/correct `Id` value.
return this.Id.GetHashCode();
}
}
Выход за пределы это, Я бы не стал строить отдельный PersonList
тип . Коллекция List<Person>
generi c почти наверняка уже делает то, что вам нужно.
В любом случае, все еще стоит рассмотреть, как можно реализовать метод Exist()
из оригинального PersonList
учебный класс. Одна вещь, которую я хотел бы сделать здесь, - это избегать попыток выделить новые объекты для завершения поиска. Имея это в виду:
public bool Exist(int inputParameter)
{
return personList.Any(p => p.Id == inputParameter);
}
Обратите внимание, что в большинстве случаев это по-прежнему будет выделять новый объект итератора, но в настоящее время ведется работа над тем, чтобы со временем эти операции linq стали более дружественными по отношению к памяти. Это также намного меньше кода. Если у вас есть функция, которая дает результат boolean
, нет веской причины помещать ее в блок if()
только для того, чтобы вернуть тот же результат.
И если мы хотим быть действительно агрессивными в распределении средств, мы можем сделать это следующим образом:
public bool Exist(int inputParameter)
{
foreach(var p in personList)
{
if (p.Id == inputParameter) return true;
}
return false;
}