Найти элемент внутри List<T>, предоставив образец экземпляра объекта

Почему есть List<T>.Contains(T) метод но нет List<T>.Find(T) метод? Только Finds, которые поддерживают предикаты, поддерживаются. Если у нас есть существующий экземпляр T, заполненный значением свойства для его идентификатора (но без других свойств), почему мы не можем выполнить поиск, предоставив этот экземпляр объекта для поиска в Listособенно когда мы реализовали IEquatable<T> за T и хотел бы использовать то, что там. Но так как мы не можем, мы должны повторить все, что мы сделали в IEquatable реализация в нашем Find(predicate) вызов.

3 ответа

Решение

Вы можете позвонить IEquatable<T> член (ы) в вашем Predicate<T>, Тогда ты не будешь повторяться.

MyClass a = new MyClass(); //sample for finding; IEquatable<MyClass>
List<MyClass> list = GetInstances();

MyClass found = list.Find( mc => mc.Equals(a) );

Как насчет этого

list.Any(i => i.ID == searchObj.ID);

РЕДАКТИРОВАТЬ:

Я думаю, что понял ваш вопрос сейчас. Вы можете использовать List<T>.IndexOf Метод для этого:

int index = myList.IndexOf(mySample);

if(index != -1)
{
   var item = myList[index];
   // Do something with item.
}

Но это было бы довольно странно, потому что ясно, что ваше определение равенства - это не полная картина - это злоупотребление равенством, ИМО.

Другие вопросы по тегам