如何使用IEnumerable公共属性?

时间:2014-03-13 12:43:08

标签: c# ienumerable

public class Kuku
{
    private LinkedList<MyClass> m_list;
    public IEnumerable<MyClass> Locations { get { return m_list; } }
}

我需要在public class FindAllMyClass中实施 迭代MyClass中所有Kuku个对象的方法 - 我不知道如何使用Locations中的Kuku属性。

我应该定义IEnumerable Locations还是只使LinkedList m_list成为公共属性?

我应该定义IEnumerable<MyClass> Locations还是仅将LinkedList<MyClass> m_list定义为public属性?

public class FindAllMyClass
{
    public void itMethod(Kuku input)
    {
        //This is not correct
        foreach (MyClass c in input.Locations)
        {
        }
    }
}

3 个答案:

答案 0 :(得分:2)

  

为什么要定义IEnumerable Locations而不只是让LinkedList m_list成为公共财产?

几个可能的原因:

  • 如果您以后决定不想将其作为LinkedList<>而是作为常规List实施,该怎么办?还是一个懒惰的集合类型?还是数组?

  • 将该集合公开为通用IEnumerable<T>,您可以在不更改公共合同的情况下更改内部实施。

  • 如果您将集合设为属性(具有get; set;访问者),则允许客户端添加,删除甚至替换整个列表。将其公开为IEnumerable表示该列表意图是只读的(除非您在其他地方公开Add方法)。

  

我不知道如何使用Kuku的Locations属性。

当然你这样做 - 你已经在你的样本中做到了:

foreach (MyClass c in input.Locations)
{
}

或者您可以使用Linq搜索或汇总集合中的数据(foreach仍适用于更新实例。

答案 1 :(得分:0)

您可以使用LINQ来对象:

input.Locations.Where(x=> x.Property1 == value1 && x.Property2 > value2);

答案 2 :(得分:0)

IEnumerable为您提供了一种方法,可以从您的类中公开具有以下属性的列表:

  • 它独立于实现 - 您可以更改内部使用的列表类型,而无需更改使用您的类的所有内容
  • 它与LINQforeach和其他各种语言结构很好地结合在一起
  • 它在列表中提供了只读视图,因此其他人无法更新列表(插入/删除项目)