![](/img/trans.png)
[英]Convert IEnumerable<IEnumerable<T>> to List<List<T>>
[英]Return IEnumerable<T> or convert to List<T> immediately?
我正在設計一個帶有幾個返回對象列表的函數的類。 我注意到將IEnumerable<T>
轉換為List<T>
時,調試變得更加容易,因為可以在“監視”窗口中查看對象。 但是,對於IEnumerable
,我不確定這是否是最佳實踐。
問:哪個更好?
public IEnumerable<MyData> GetData()
{
return Foo();
}
public IEnumerable<MyData> GetData()
{
return Foo().ToList();
}
好的做法-除非有充分的理由/必要,否則不要工作。 因此,除非您有特殊原因-只需返回IEnumerable<MyData>
而不在其上調用ToList()/ ToArray()即可。
潛在原因:
最好將IEnumerable<..>
作為更通用的類型返回。 之后, 呼叫者可以決定如何處理它。 在您的情況下,在兩種情況下都返回IEnumerable<..>
,因此沒有任何理由運行ToLIst()
,只需返回IEnumerable
這確實取決於您的要求。 方法簽名的返回類型也是該方法合同的一部分。 返回IEnumerable的方法表示值流,而返回List(或更抽象的Collection)的方法則返回可變的值集合。
我通常會嘗試遵循以下做法。
如果您要使用將要處理的工作單元,則最好使用元素列表,因為一旦處理了該元素,您將無法再獲取元素。
在所有其他情況下,可以返回通用IEnumerable ,因為它提供了更好的靈活性。
最后,一切都取決於您的要求,請注意IEnumnerable不會在分配給變量的確切時刻而是在枚舉時檢索元素。
IEnumerable<T>
向調用方提供IEnumerable<T>
集合的協定。但是,當您使用IList<T>
或List<T>
,建議它們可以直接添加或刪除元素(而無需通過任何方法,例如添加或注冊您的類實現中可能包含的內容)。 如果您只是想讓調用者看到“項目”,則IEnumerable是更好的合同。
雖然不是100%,但我將IEnumerable返回值視為只讀集合。
易於調試應該是良好設計的第二要務。 我建議您僅對類進行單元測試,而不要依賴於能夠在運行時窺視內部。 但是,在大多數情況下,調試器將'base'類顯示為第一項。 因此,IEnumerable的第一項是您實際上在內部使用的列表。 只需要再一次“展開”即可看到成員!
返回IEnumerable可以使調用方決定如何處理結果-枚舉結果或將其傳遞給其他內容而無需枚舉當前值。 ToList()強制將此時要枚舉的數據放入列表,然后將其傳遞給調用方。
因此,IEnumerable很可能是兩者中最好的-但是調試時使用ToList會更容易。
有一個簡單的規則:返回更多conrette,接受更多泛型。
如果您的返回值確實是IEnumerable<>
原樣返回它。 但絕對不要這樣做:
public IEnumerable<MyData> GetData()
{
return this.list; // list = new List<MyData>();
}
上面的代碼無需任何限制即可限制調用方。 這將是一個列表,並且調用者無論如何都可以將其強制轉換為列表並清除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.