繁体   English   中英

从 IEnumerable 中删除项目<T>收藏

[英]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 从现在开始,您将能够使用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().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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM