Ответ 1
Не удаляя, но создавая новый List
без этого элемента с помощью LINQ:
// remove
users = users.Where(u => u.userId != 123).ToList();
// new list
var modified = users.Where(u => u.userId == 123).ToList();
У меня есть всплывающая коллекция 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 ??????
}
}
Как добавить в коллекцию?
Не удаляя, но создавая новый List
без этого элемента с помощью LINQ:
// remove
users = users.Where(u => u.userId != 123).ToList();
// new list
var modified = users.Where(u => u.userId == 123).ToList();
Вы не можете удалить элемент из 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
, вероятно, путь.
Попробуйте включить 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
Вы не можете. IEnumerable<T>
может быть только повторен.
Во втором примере вы можете удалить из оригинальной коллекции, итерации по ее копии
foreach(var u in users.ToArray()) // ToArray creates a copy
{
if(u.userId != 1233)
{
users.Remove(u);
}
}
Интерфейс 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);
}
}
Вы не можете удалить элементы IEnumerable<T>
, но вы можете использовать метод Enumerable.Skip
Теперь существует метод расширения для преобразования 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);