从通用列表中删除元素

时间:2013-03-27 13:11:44

标签: c# .net linq generics ienumerable

我无法从IEnumerable列表中删除元素,但此列表是对List的引用,List是其他类的私有属性。 如果我将personsCollection.Remove(theElement)放在同一个类(类管理器)中,它工作得很完美,但我需要删除该元素,因为另一个类(类ManagerDelete)。请问我该怎么做? 感谢。

class Other
{
  //Some code
  public IEnumerable<Person> SearchByPhone (string value)
    {
        return from person in personCollection
               where person.SPhone == value
               select person;
    }
 }

class ManagerDelete
{ 
//Some code
IEnumerable<Person> auxList= SearchByPhone (value);
//I have a method for delete here  
}

class Manager
{ 
//Some code
 private List<Person> personsCollection = new List<Person>();
}

7 个答案:

答案 0 :(得分:12)

您无法从IEnumerable<T>中删除您需要使用IList<T>类型来直接添加/删除项目。

答案 1 :(得分:4)

您需要了解IEnumerable接口允许您执行的操作。

我列在您应该按设计使用的接口列表下方,以及在不同情况下的需要。在您的示例中,您需要使用IList

  • ICollection定义一般特征(例如,大小,枚举, 所有非泛型集合类型的线程安全性。

  • ICloneable允许实现对象返回自身的副本 致来电者。

  • IDictionary允许非泛型集合对象表示其中 使用键/值对的内容。

  • IEnumerable返回实现IEnumerator接口的对象 (见下表)。

  • IEnumerator启用集合项的foreach样式迭代。

  • IList提供添加,删除和索引项目的行为 顺序的对象列表。

答案 2 :(得分:3)

达伦是对的。 无需转换为列表即可:

personCollection = personCollection.Except(SearchByPhone(value));

在ManagerDelete。

答案 3 :(得分:2)

您可以使用ToListIEnumerable转换为List,然后就可以从中删除内容。

var auxList= SearchByPhone (value).ToList();
auxList.Remove(something);

答案 4 :(得分:1)

您可以将IEnumerable投射到IList。如果IEnumerable真的是List,这将有效。然而,这是一个糟糕的设计。如果您要删除项目,则应将列表公开为IList,而不是IEnumerable

答案 5 :(得分:1)

IEnumerable实际上只是一个界面,我已经有了这个集合,你可以迭代它。

如果你看看IEnumerable接口的实际细节,它不包含太多,只有一个允许调用者迭代它的方法:

http://msdn.microsoft.com/en-gb/library/9eekhta0.aspx

List类型允许您删除它们的原因是,它是在IEnumerable接口的顶层上构建的,为您提供更多功能。它应该代表您可以操作的对象集合。而IEnumerable根本就不是为此而设计的。

Remove方法实际上源于ICollection也实现的基础List接口:

http://msdn.microsoft.com/en-gb/library/bye7h94w.aspx

答案 6 :(得分:1)

除了其他答案:您的数据结构选择似乎不够。如果您真的打算从容器中删除元素,那么容器首先不能 IEnumerable<>

考虑以下选择:

  • IEnumerable<>切换到ICollection<>;
  • 使用过滤(.Where())替换删除并获取单独的已过滤IEnumerable<>