我有一个popuplated 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 ??????
}
}
如何添加到集合中?
答案 0 :(得分:35)
不删除但是在没有LINQ的那个元素的情况下创建一个新的List
:
// remove
users = users.Where(u => u.userId != 123).ToList();
// new list
var modified = users.Where(u => u.userId == 123).ToList();
答案 1 :(得分:14)
您无法从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
可能是要走的路。
答案 2 :(得分:8)
尝试将IEnumerable
转换为List
。从现在开始,您可以使用List
的{{1}}方法删除项目。
要使用Linq将其作为参数传递给Remove
方法,您可以通过以下方法获取项目:
Remove
users.Single(x => x.userId == 1123)
代码如下:
users.First(x => x.userId == 1123)
答案 3 :(得分:1)
你做不到。 IEnumerable<T>
只能迭代。
在第二个示例中,您可以通过迭代原始集合来删除原始集合
foreach(var u in users.ToArray()) // ToArray creates a copy
{
if(u.userId != 1233)
{
users.Remove(u);
}
}
答案 4 :(得分:1)
users.toList()。RemoveAll(user => <您的条件>)
答案 5 :(得分:0)
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 :(得分:0)
您无法移除IEnumerable<T>
元素,但可以使用Enumerable.Skip Method
答案 7 :(得分:0)
您可以执行以下操作:
users = users.Where(x => x.userId != userIdToRemove);
答案 8 :(得分:-2)
现在有了一种扩展方法,可以将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);