Удалить элемент из коллекции IEnumerable <T>

У меня есть всплывающая коллекция IEnumerable<User>.

Я хочу удалить элемент из него, как я могу это сделать?

foreach(var u in users)
{
  if(u.userId = 1123)
  {
    // remove!
  }
}

Я знаю, что вы не должны удалять во время цикла, поэтому я не против создания новой коллекции или ее удаления.

Но я не знаю, как удалить предмет, как-то потерянный по какой-то причине по этому поводу!

В качестве альтернативы я также смущаюсь, как создать новую коллекцию, например:

IEnumerable<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        modifiedUsers.add ??????
   }
}

Как добавить в коллекцию?

Ответ 1

Не удаляя, но создавая новый List без этого элемента с помощью LINQ:

// remove
users = users.Where(u => u.userId != 123).ToList();

// new list
var modified = users.Where(u => u.userId == 123).ToList();

Ответ 2

Вы не можете удалить элемент из IEnumerable; это может быть только перечислено, как описано здесь: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

Вы должны использовать ICollection если хотите добавить или удалить элементы. Может быть, вы можете попробовать и разыграть свой IEnumerable; это, конечно, сработает, только если базовый объект реализует ICollection '.

Смотрите здесь для получения дополнительной информации о ICollection: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx

Конечно, вы можете просто создать новый список из вашего IEnumerable, как указывает lante, но это может быть "субоптимальным", в зависимости от вашего фактического варианта использования, конечно.

ICollection, вероятно, путь.

Ответ 3

Попробуйте включить IEnumerable в List. С этого момента вы сможете использовать метод List Remove для удаления элементов.

Чтобы передать его как параметр метода Remove с помощью Linq, вы можете получить элемент с помощью следующих методов:

  • users.Single(x => x.userId == 1123)
  • users.First(x => x.userId == 1123)

Код выглядит следующим образом:

users = users.ToList(); // Get IEnumerable as List

users.Remove(users.First(x => x.userId == 1123)); // Remove item

// Finished

Ответ 4

Вы не можете. IEnumerable<T> может быть только повторен.

Во втором примере вы можете удалить из оригинальной коллекции, итерации по ее копии

foreach(var u in users.ToArray()) // ToArray creates a copy
{
   if(u.userId != 1233)
   {
        users.Remove(u);
   }
}

Ответ 5

Интерфейс IEnumerable - это просто, перечисляемый - он не предоставляет каких-либо методов для Add или Remove или изменения списка вообще.

Интерфейс просто предоставляет способ итерации по некоторым элементам - большинство реализаций, которые требуют перечисления, будут реализовывать IEnumerable например List<T>

Почему бы вам просто не использовать свой код без неявного перевода в IEnumerable

// Treat this like a list, not an enumerable
List<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        // Use List<T>.Add
        modifiedUsers.Add(u);
   }
}

Ответ 6

Вы не можете удалить элементы IEnumerable<T>, но вы можете использовать метод Enumerable.Skip

Ответ 7

Теперь существует метод расширения для преобразования IEnumerable<> в Dictionary<,> который затем имеет метод Remove.

public readonly IEnumerable<User> Users = new User[]; // or however this would be initialized

// To take an item out of the collection
Users.ToDictionary(u => u.Id).Remove(1123);

// To take add an item to the collection
Users.ToList().Add(newuser);