[英]What does LINQ's Select(a => a) do?
我在看下面的代碼
public IEnumerable<RoleRecord> GetRoles() {
var roles = _roleRepository.Table.Select(role => role);
return roles.ToList();
}
該Table
是IQueryable<RoleRecord> Table { get; }
IQueryable<RoleRecord> Table { get; }
有沒有更好的方法來寫這個?
Select(role => role)
有效地向自身投射-因此基本上在這里什么也不做。
return _roleRepository.Table.ToList();
...將達到相同的效果,或:
return _roleRepository.Table;
如果您樂於返回可枚舉的列表而不是已解決的列表。
這使人們猜測Table
是有效的IEnumerable<T>
,有資格使用Select()
或ToList()
。
ToList
將完全迭代Table
枚舉,但是將作為IEnumerable<T>
返回。 消費者將要遍歷列表,這可能比遍歷Table
便宜。
更新:與@servy聊天之后,返回IEnumerable<T>
(在您的情況下,是從Select(role => role)
)和返回List<T>
之間的一個重要區別是,調用方具有List<T>
可以將IEnumerable<T>
回List<T>
並對其進行突變:
IEnumerable<RoleRecord> results = GetRoles();
var asList = (List<RoleRecord>)results;
asList.Add(new RoleRecord());
asList.RemoveAt(0);
但是要注意,自投影不是此處的決定因素,這是因為您使用迭代器塊作為IEnumerable<T>
實現而不是List<T>
。
就是說,這種特殊的行為差異在您的情況下不會很明顯,因為您調用了ToList()
,所以原始答案中的代碼是正確的-它是等效的(從技術上來說稍快一些)。
如果沒有任何過濾條件,則無需調用Select。
就像是:
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
會更簡單嗎? 調用.ToList()顯然會充實集合,但我認為這就是您想要的。
那應該簡化為:
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
基本上, a => a
只是一個“身份”投影,即a
本身。 在這種情況下,它真的不買任何東西。
在某些情況下,當您不想執行某項操作時,它有時可用作占位符。 但是,在這種情況下,沒有必要,因為最終結果只是對原始序列執行ToList()
,而無需使用Select()
即可直接完成。
當然,這是假定原始方法的兩行之間沒有其他操作。
LINQ的Select(a => a)
什么作用?
它將序列中的每個元素投影到新表單中,該表單僅包含您指定的元素(“ a”)。
我相信你可以寫:
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
如果沒有,那么你可以嘗試
return (from r in _roleRepository.Table select r).ToList();
Select方法返回一個“投影”-對可枚舉的源中每個元素的修改。 在這種情況下,它會將元素投影到自身,因此是多余的。
如果要猜測其意圖,我會說包含選擇,並且查詢未與其“ ToList()”終止符內聯(強制對Linq鏈進行評估以生成所有元素),以便可以更容易調試,以查看查詢正在生成的確切元素。 或者,此查詢最初可能是由精通SQL的人寫的,他認為所有LINQ查詢都應該包含SQL SELECT查詢的一部分。
無論如何,除了刪除Select之外,還可以在返回中內聯此查詢:
public IEnumerable<RoleRecord> GetRoles() {
return _roleRepository.Table.ToList();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.