我无法从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>();
}
答案 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)
您可以使用ToList
将IEnumerable
转换为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
接口:
答案 6 :(得分:1)
除了其他答案:您的数据结构选择似乎不够。如果您真的打算从容器中删除元素,那么容器首先不能 IEnumerable<>
!
考虑以下选择:
IEnumerable<>
切换到ICollection<>
; .Where()
)替换删除并获取单独的已过滤IEnumerable<>
。