[英]Remove an item from an IEnumerable<T> collection
我有一个弹出的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().RemoveAll(user => <你的条件>)
现在有一个扩展方法可以将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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.