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

loy*_*low 47 c# ienumerable

我有一个popuplated IEnumerable<User>集合.

我想从中删除一个项目,我该怎么做?

foreach(var u in users)
{
  if(u.userId = 1123)
  {
    // remove!
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道你不应该在循环时删除,所以我不介意创建新集合或删除它.

但我不知道如何删除一个项目,因为某种原因丢失了!

或者我也很困惑,如何创建一个新的集合,如:

IEnumerable<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        modifiedUsers.add ??????
   }
}
Run Code Online (Sandbox Code Playgroud)

如何添加到集合中?

lan*_*nte 45

不删除但List使用LINQ 创建没有该元素的新元素:

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

// new list
var modified = users.Where(u => u.userId == 123).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 你的术语不正确.您没有从列表中删除项目.在这两个示例中,您都创建了一个新列表,旧列表不受影响.您只是在第一个示例中覆盖了引用,因此声明它导致`remove`不正确.您应该更新您的问题以澄清这一点. (9认同)
  • 在这两种情况下,您都在创建一个新列表。第一个示例只是覆盖了引用。 (6认同)
  • 显然标题和作者想要删除该项目,而不是创建一个没有它的新列表...... (2认同)

Wil*_*eer 16

您无法从中删除项目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 可能是要走的路.


小智 11

你可以这样做:

users = users.Where(x => x.userId != userIdToRemove);
Run Code Online (Sandbox Code Playgroud)


dut*_*tzu 10

试着把它IEnumerable变成一个List.从你这一点都将能够使用ListRemove方法来删除项目.

要将它作为参数传递给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
Run Code Online (Sandbox Code Playgroud)


Til*_*lak 3

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

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

foreach(var u in users.ToArray()) // ToArray creates a copy
{
   if(u.userId != 1233)
   {
        users.Remove(u);
   }
}
Run Code Online (Sandbox Code Playgroud)