返回IEnumerable <t>或立即转换为List <t>?</t> </t>

时间:2012-09-20 07:48:25

标签: c# ienumerable

我正在设计一个具有多个函数的类,返回对象列表。我注意到,当IEnumerable<T>转换为List<T>时,调试变得更容易,因为可以在Watch窗口中查看对象。但是,对于IEnumerable,我不确定这是否是最佳做法。

问:哪个更好?

public IEnumerable<MyData> GetData()
{
    return Foo();
}

public IEnumerable<MyData> GetData()
{
    return Foo().ToList();
}

7 个答案:

答案 0 :(得分:5)

良好做法 - 除非有充分理由/要求,否则不要工作。因此,除非您有特殊原因 - 只需返回IEnumerable<MyData>而不调用ToList()/ ToArray()就可以了。

潜在原因:

  • 函数承诺完成对可能延迟枚举的评估
  • 您希望多次枚举结果

答案 1 :(得分:2)

更好地返回IEnumerable<..>作为更通用的类型。 调用者之后可以决定如何处理它。在你的情况下,你会在两种情况下都返回IEnumerable<..>,因此没有任何理由运行ToLIst(),只需返回IEnumerable

答案 2 :(得分:1)

这实际上取决于您的要求。方法签名的返回类型也是该方法的合同的一部分。返回IEnumerable的方法指示值流,而返回List(或更抽象,Collection)的方法返回可变的值集合。

我通常会尝试跟上以下做法。

  • 当没有关于值数量的固定知识或加载所有值将花费大量时间/资源(例如查询结果)时,尝试使用IEnumerable或IObservable传输数据。
  • 将数组用于预先知道的不应该是可变的固定集。
  • 使用ICollection预先知道可以变异的固定集。

答案 3 :(得分:1)

我最好使用一个元素列表,以防你使用将要处理的工作单元,因为一旦它被处理掉,你将无法获得你的元素。

在所有其他情况下,可以返回通用 IEnumerable ,因为它提供了更好的灵活性。

最后,这一切都归结为您的要求,请注意,IEnumnerable不会在分配给变量的确切时刻检索元素,而是在枚举时检索。

答案 4 :(得分:1)

IEnumerable<T>向来电者提供T集合的合同。但是,当您使用IList<T>List<T>时,您建议他们可以直接添加或删除元素(不通过任何方法,例如你可能在你的类实现中添加或注册)。如果你的意图只是让调用者看到“项目”,IEnumerable就是更好的合同。

虽然它不是100%,但我将IEnumerable返回值视为只读集合。

易于调试应该是良好设计的次要因素。我建议您只是对您的类进行单元测试,而不是依赖于能够在运行时查看内部​​。但是,在大多数情况下,调试器将“基础”类显示为第一项。所以IEnumerable的第一项是您实际在内部使用的List。只需要一次“扩展”即可看到会员!

答案 5 :(得分:0)

返回IEnumerable允许调用者决定如何处理结果 - 枚举它或将其传递给其他东西而不在当前枚举它。 ToList()强制将此时枚举的数据放入一个列表中,然后将该列表传递给调用者。

因此 - IEnumerable很可能是两者中最好的 - 但是在调试时使用ToList会更容易。

答案 6 :(得分:0)

有一个简单的规则:返回更多concrette,接受更多泛型。

如果您的返回值确实为IEnumerable<>,则按原样返回。但永远不要那样做:

public IEnumerable<MyData> GetData()
{
    return this.list; // list = new List<MyData>();
}

以上代码无需任何限制来限制来电者。它将是一个列表,并且调用者无论如何都能够将其转换为列表并清除它。例如。