найти и удалить из IList - PullRequest
       1

найти и удалить из IList

7 голосов
/ 10 апреля 2011

У меня есть список пользователей

private IList<User> _Players

У меня есть способ удалить конкретного пользователя из списка

public virtual void RemovePlayer(User User)
{
    int index=_Players.Select(T=>T.ID).ToList().IndexOf(User.ID);
    _Players.RemoveAt(index);
}

Я хотел бы знать, есть ли более простой способудалить пользователя из этого списка

Ответы [ 5 ]

11 голосов
/ 10 апреля 2011

Если используемые вами User объекты содержатся в списке _ Players (те же ссылки на объекты), вы можете просто сделать

_Players.Remove(user);

В противном случае, если только идентификатор совпадает, вы можете сделать:

_Players.RemoveAll( p => p.ID == user.ID);
9 голосов
/ 10 апреля 2011

Как насчет этого? Используйте это, если ваш параметр User не является частью _Players.

 _Players.Remove(_Players.SingleOrDefault(x => x.ID == User.ID));

SingleOrDefault() гарантирует, что если совпадение не найдено, возвращается ноль. При попытке удалить null ошибка не возникает и не выдается.

7 голосов
/ 10 апреля 2011

Существует два сценария: переменная user, которую вы передаете RemovePlayer

  1. , фактически содержится в вашем списке
  2. имеет то же значение ID,но это не тот же объект.

Из вашего примера кода невозможно сказать.

Для первого случая просто позвоните _Players.Remove(user).Во втором случае реализуйте интерфейс System.IEquatable<User> на User, чтобы определить значение по умолчанию EqualityComparer<User>, а затем снова вызовите _Players.Remove(user).Этот второй сценарий работает в обоих случаях.

3 голосов
/ 10 апреля 2011

Зависит от того, что если вы внедрили IEquatable для своего пользователя для сравнения по ID, то вы можете просто сделать _Players.Remove(user).

В противном случае:

var doomed = _Players.FirstOrDefault(p => p.ID == user.ID);
if (doomed != null)
   _Players.Remove(doomed);
1 голос
/ 12 апреля 2014

Только в случае, если у вас есть List<T>:

Все упомянутые алгоритмы с SingleOrDefault() / FirstOrDefault() требуют двух обходов из списка:

1) первый, чтобы найти элемент по критериям

2) второй, чтобы найти индекс элемента по его значению, найденному в шаге # 1

Вместо этого сделать это немного эффективнее:

int index = list.FindIndex(i => criteria);

if (index >= 0)
  list.RemoveAt(index);
...