簡體   English   中英

用linq替換foreach循環

[英]Replace foreach loop with linq

我試圖替換代碼

foreach (var discovery in mpwrapper.parser.Discoveries)
{
   solution.AddFile("Discoveries", discovery.DisplayStringName + ".mpx", discovery);
}

使用以下linq表達式

mpwrapper.parser.Discoveries.Select(
                    s => solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s));

但是得到了一個錯誤

無法從用法推斷出方法'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)'的類型參數。 嘗試顯式指定類型參數。

如何將這個foreach循環轉換為linq查詢,我在IEnumerable集合中的每個對象上執行一個方法?

我認為你需要的是ForEach方法;)

mpwrapper.parser.Discoveries.ToList().ForEach(s => { solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s); });

問題是Select需要返回一個值,而Linq也不是為了變異集合而設計的。 將select視為對集合的轉換,而不是每個項目的狀態更改

也許foreach循環是最好的解決方案

LINQ代表語言集成查詢...但你實際上並沒有查詢任何東西。

如果mpwrapper.parser.DiscoveriesList<T> ,則可以使用ForEach方法; 或者,如果它是一個IEnumerable ,你總是可以添加一個ForEach擴展方法......但這更像是一個小的美學變化,與LINQ無關。

List<T>.ForEach方法可以解決這個問題。

但是, IEnumerable<T>上不存在此方法。

我在.All方法中使用了一點作弊。 它只需要一個返回布爾值並且非常整齊地呈現。 我在.All中包含了嵌入linq的樣本

configurations.All(c =>
{
    var gcx = globalConfigurations.FirstOrDefault(gc =>
        gc.Type == c.Type && configurationGuids.Any(cGuid => gc.Guid == cGuid)
    );
    return true;
});

如果發現是一個列表,那么就這樣做

mpwrapper.parser.Discoveries.ForEach(discovery => solution.AddFile("Discoveries", discovery .DisplayStringName + ".mpx", discovery);

如果沒有,請先將其轉換為List :)

嘗試這個:

mpwrapper.parser.Discoveries.ToList()
    .ForEach(s =>
        solution.AddFile("Discoveries", s.DisplayStringName + ".mpx", s));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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