从 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 ??????
   }
}

如何添加到集合中?

从 IEnumerable<T> 集合中删除项目

不是删除而是使用 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。从这一点开始,您将能够使用 ListRemove 方法来删除项目。

若要使用 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接口

就是枚举的 - 它根本不提供任何方法来AddRemove或修改列表。

该接口只是提供了一种迭代某些项目的方法 - 大多数需要枚举的实现将实现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);