从IEnumerable <t>集合中删除项目</t>

时间:2013-01-03 16:55:30

标签: c# ienumerable

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

如何添加到集合中?

9 个答案:

答案 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界面就是可枚举的 - 它不会向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);
   }
}

答案 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);