簡體   English   中英

LINQ的Select(a => a)有什么作用?

[英]What does LINQ's Select(a => a) do?

我在看下面的代碼

    public IEnumerable<RoleRecord> GetRoles() {
        var roles = _roleRepository.Table.Select(role => role);
        return roles.ToList();
    }

TableIQueryable<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM