2014-10-03 67 views
1

看一看下面的例子:ToList()負責調用者或被調用者?

public IEnumerable<LogEntry> GetLogs(string groupName) 
{ 
    return _Db.Logs.Where(l => l.groupName == groupName); 
} 

如果我真的返回此方法之前添加ToList()?或者這是來電者的責任?

+0

這是什麼都與Java呢?情況如何?這裏沒有「一刀切」的解決方案。 – 2014-10-03 10:22:41

+0

嗯,我認爲更多的是適用於C#或Java的泛型編程問題。但很有可能我錯了;) – 2014-10-03 10:36:43

回答

2

如果您在返回之前將添加ToList() - 它將導致完全枚舉您的enumerable。

如果您將返回IEnumerable而不是將其轉換爲列表 - 那麼它將首次被調用者枚舉。

因此,如果您的數據大小在_Db.logs很大 - 可能最好在調用者的大小上枚舉它,因爲調用者不會列舉整個數據集(取決於調用者使用它的計劃)。

1

將您的IEnumerable轉換爲列表會讓您失去IEnumerable,主要是惰性評估的所有好處。所以,如果你的來電者真的想創建一個列表,讓他,但不要強迫他。

+2

有一些有效的情況,你可能想返回一個被屏蔽爲列表的列表。例如,您從數據庫獲取數據,以便在關閉連接之前檢索所有數據,但不希望通過添加到列表中給調用方留下可能影響未來結果的印象。 – Rawling 2014-10-03 10:34:16

0

如果您想讓人們選擇何時評估查詢,請返回IEnumerable。如果將IList指定爲返回類型,則必須通過調用ToArray()或ToList()來評估表達式。

0

我建議使用這種方法。 你應該通過你想要的,不會失去控制數據採集時間。

public List<LogEntry> GetLogs(Expression<Predicate<LogEntry>> where) 
{ 
    return _Db.Logs.Where(where).ToList(); 
} 

}

相關問題