【问题标题】:Delete an element from a generic list从通用列表中删除元素
【发布时间】:2013-03-27 13:11:43
【问题描述】:

我无法从 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>();
}

【问题讨论】:

    标签: c# .net linq generics ienumerable


    【解决方案1】:

    您无法从 IEnumerable&lt;T&gt; 中删除,您需要将其设为 IList&lt;T&gt; 类型才能直接从中添加/删除项目。

    【讨论】:

    • IList 不是必须的,ICollection 就足够了。
    【解决方案2】:

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

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

    • ICollection 定义一般特征(例如,大小、枚举、 和线程安全)适用于所有非泛型集合类型。

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

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

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

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

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

    【讨论】:

    • 别忘了IListIList&lt;T&gt; 之间是有区别的,List 可以实现IList 但其他强类型列表可能不会。
    【解决方案3】:

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

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

    在 ManagerDelete 中。

    【讨论】:

    • +1 用于使用 except,但是请注意,通过替换 personCollection 任何其他引用 personCollection 的对象仍将指向旧对象,这可以通过使用来解决BindingSource 或类似的类来充当间接。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        IEnumerable 实际上只是一个接口,我有这个集合,你可以迭代它。

        如果你看一下 IEnumerable 接口的实际细节,它包含的内容并不多,只是一个允许调用者对其进行迭代的方法:

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

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

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

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

        【讨论】:

          【解决方案7】:

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

          考虑以下选择:

          • IEnumerable&lt;&gt;切换到ICollection&lt;&gt;
          • 将删除替换为过滤掉 (.Where()) 并获得单独过滤的 IEnumerable&lt;&gt;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-05
            • 2023-03-27
            • 1970-01-01
            • 2014-12-19
            • 2013-11-25
            相关资源
            最近更新 更多