从 IEnumerable 集合中删除项目
本文关键字:集合 删除项目 IEnumerable | 更新日期: 2023-09-27 17:50:29
我有一个弹出的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 ??????
}
}
如何添加到集合中?
不是删除而是使用 LINQ 创建一个没有该元素的新List
:
// 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
当然,正如 lante 所指出的那样,您可以从 IEnumerable 创建一个新列表,但这可能是"次优",当然,这取决于您的实际用例。
ICollection
可能是要走的路。
尝试将IEnumerable
转换为List
。从这一点开始,您将能够使用 List
的 Remove
方法来删除项目。
若要使用 Linq 将其作为参数传递给 Remove
方法,可以通过以下方法获取该项:
-
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
你可以做这样的事情:
users = users.Where(x => x.userId != userIdToRemove);
你不能。 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 方法
users.toList((.全部删除(用户 => <您的条件>(您的条件>
现在有一个扩展方法可以将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);