2013-11-26 79 views
1

每次我必須返回一個集合,我已經返回一個List。我剛剛讀過,我應該返回IEnumerable或類似的接口(例如IQueryable)。效率的損失是否值得返回IEnumerable而不是List?

我看到的問題是我經常想用列表工作。爲此,我必須對返回的結果執行.ToList()

//... 
List<Guid> listOfGuids = MyMethod().ToList(); 
//... 
public IEnumerable<Guid> MyMethod() 
{ 
    using (var context = AccesDataRépart.GetNewContextRépart()) 
    { 
     return context.MyTable.ToList(); 
    } 
} 

正在執行.ToList()兩次的權利實踐。

+0

爲什麼在MyMethod中調用ToList?您可以直接返回context.MyTable ... –

+3

否@Thomas,上下文將被丟棄,並且MyTable將不可查詢 – Moho

+0

如果要將結果用作列表,只需返回列表對象。你可以使用'IList '作爲返回類型。 – Moho

回答

3

如果調用者實際上需要一個列表,那麼返回一個列表(如果這是你所擁有的)。當你已經有一個列表,並且當你知道調用者需要一個列表時返回IEnumerable,這只是浪費,並沒有真正的好處。

如果您覺得您有可能會改變未來版本方法中返回的對象的基礎類型,可能會讓庫實現者更容易返回接口,但是當返回更多的派生類型時,對於方法的調用者來說更容易(他們有能力對它做更多的事情,而不是僅僅給予接口)。

它與輸入參數相反。當在更多的派生類型中傳遞參數時,庫實現者必須使用該類型更強大的功能,特別是在將來的版本中,但使用更少限制的類型會使庫的調用者更輕鬆,你需要把他們的東西轉換成你的方法接受的東西。

這使得在編寫庫公共API時,這些決定有點值得思考。你需要考慮你現在需要多少「權力」,以及你認爲你將來需要多少「權力」。一旦你知道如何限制/一般的類型需要你做你的工作,然後你可以努力使你的方法更方便用於呼叫者。沒有人會在的情況下在中應用這個答案。說你應該總是返回IEnumerable而不是List是不正確的,就像說你應該總是返回List也是不正確的。您需要根據您所處的具體情況作出判斷電話。

2

我建議您只是返回List<T>IList<T>。有人可能會建議不要返回List的原因是它會鎖定您的實現。根據API的使用情況,這可能不是一個問題。

我的一般經驗法則是在你接受的內容中更寬容,更具體地回答你的內容。因此,方法參數爲IEnumerable<T>,方法返回值爲IList<T>,List<T>或可能甚至T[]

1

您不必在返回的值上調用ToList,它已經是List。您無法返回IEnumerable的原因是,您將在您的DataContext附近有using聲明將其處置。因此,修改您的方法返回類型爲List<T>,然後不要在返回的值上調用ToList

//... 
List<Guid> listOfGuids = MyMethod(); //No ToList here 
//... 
public List<Guid> MyMethod() 
{ 
    using (var context = AccesDataRépart.GetNewContextRépart()) 
    { 
     return context.MyTable.ToList(); 
    } 
} 
1

我剛讀,我應該返回的IEnumerable或類似的接口 (IQueryable的舉例)。

不用擔心 - 如果在收集消耗的點上實際需要列表對象,則返回IList<>List<>。返回IEnumerable的問題可能是沒有人知道列舉它的成本是什麼 - 這是整個Linq概念的一個缺點,並不總是從鼓勵所有人無處不在返回IEnumerable。

0

這真的取決於。你想在收集之前還是之後枚舉集合?

枚舉之前:每次調用ToList,ToArray等時,您都在枚舉IEnumerable。如果您在返回後多次執行此操作,這可能是多餘且浪費的。以已枚舉的形式(例如IList,Array)返回它或在返回後枚舉它並將其用於未來的處理可能更可取。

枚舉後:返回一個IEnumerable,您可以推遲集合的枚舉,直到後來(例如,節省處理前面)。如果事實證明你永遠不會枚舉集合,或者你只枚舉它的一個子集,那麼IEnumerable方法可能是非常有利的。

+0

在這種情況下,他*必須*實現序列,因爲上下文正在處理中。這不是一個在這裏考慮的選項,問題僅僅是關於返回值的類型,而不是延遲是否推遲實現查詢的結果。 – Servy

相關問題