7

我无法从 IEnumerable 列表中删除元素,但此列表是对 List 的引用,它是其他类的私有属性。如果我放入personsCollection.Remove(theElement)同一个类(类Manager),它会完美运行,但我需要删除另一个类(类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>();
}
4

7 回答 7

12

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

于 2013-03-27T13:13:37.930 回答
4

您需要了解IEnumerable接口允许您做什么。

我在下面列出了您应该根据设计使用的接口列表,以及在不同情况下需要时使用的接口。在您的示例IList中是您需要使用的。

  • ICollection 定义所有非通用集合类型的通用特性(例如,大小、枚举和线程安全)。

  • ICloneable 允许实现对象将自身的副本返回给调用者。

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

  • IEnumerable 返回实现 IEnumerator 接口的对象(请参阅下一个表条目)。

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


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

于 2013-03-27T13:21:31.480 回答
3

达伦是对的。无需转换为列表,您可以执行以下操作:

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

在 ManagerDelete 中。

于 2013-03-27T13:18:55.523 回答
2

您可以使用ToList将其转换IEnumerable为 a List,然后您可以从中删除内容。

var auxList= SearchByPhone (value).ToList();
auxList.Remove(something);
于 2013-03-27T13:27:51.743 回答
1

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

考虑以下选择:

  • 从 切换IEnumerable<>ICollection<>;
  • 将删除替换为过滤掉 ( .Where()) 并获得单独的过滤IEnumerable<>
于 2013-06-08T15:07:40.310 回答
1

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

于 2013-03-27T13:17:26.140 回答
1

An IEnumerable is literally just an interface to say, I've got this collection, you can iterate over it.

If you take a look at the actual details of the IEnumerable interface, it doesn't contain much, only a method to allow callers to iterate over it:

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

The reason why List types can allow you to remove them, is it's built on top of the IEnumerable interface, giving you more functionality. It is supposed to represent a collection of objects you can manipulate. Whereas an IEnumerable is simply not designed to do this.

The Remove method actually stems from the underlying ICollection interface that List also implements:

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

于 2013-03-27T13:18:06.930 回答