72

我有一个弹出的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 ??????
   }
}

如何添加到集合中?

4

9 回答 9

67

List不删除,而是使用 LINQ创建一个没有该元素的新元素:

// remove
users = users.Where(u => u.userId != 123).ToList();

// new list
var modified = users.Where(u => u.userId == 123).ToList();
于 2013-01-03T16:58:04.997 回答
27

您不能从IEnumerable;中删除项目 它只能被枚举,如此处所述:http: //msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

ICollection如果要添加和删除项目,则必须使用。也许你可以尝试铸造你的IEnumerable; 这当然只有在底层对象实现 ICollection 时才有效。

有关更多信息,请参见此处:http ICollection: //msdn.microsoft.com/en-us/library/92t2ye13.aspx

当然,您可以从您的 IEnumerable 中创建一个新列表,正如兰特所指出的那样,但这可能是“次优的”,这当然取决于您的实际用例。

ICollection可能是要走的路。

于 2013-01-03T16:57:18.863 回答
12

尝试将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
于 2013-01-03T16:57:20.750 回答
4

你可以这样做:

users = users.Where(x => x.userId != userIdToRemove);
于 2020-01-29T18:27:46.223 回答
3

你不能。IEnumerable<T>只能迭代。

在您的第二个示例中,您可以通过迭代它的副本从原始集合中删除

foreach(var u in users.ToArray()) // ToArray creates a copy
{
   if(u.userId != 1233)
   {
        users.Remove(u);
   }
}
于 2013-01-03T16:57:09.237 回答
0

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);
   }
}
于 2013-01-03T16:58:15.603 回答
0

您不能删除IEnumerable<T>元素,但可以使用Enumerable.Skip 方法

于 2013-01-03T16:59:14.287 回答
0

users.toList().RemoveAll(user => <你的条件>)

于 2020-03-23T12:11:31.350 回答
-3

现在有一个扩展方法可以将 a 转换IEnumerable<>为 aDictionary<,>然后有一个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);
于 2019-01-31T21:05:20.500 回答