2016-08-04 71 views
0

我目前有一個LINQ查詢來獲取一些JSON文件,然後運行一個foreach循環將JSON轉換爲一個對象。最終我想有一個List<Config>,我可以從中工作。將foreach轉換爲LINQ查詢的一部分(C#)

有沒有什麼辦法可以將它結合到LINQ查詢中,所以我剛剛得到了一條語句,並且文件的類型爲List<Config>

  var files = Directory.GetFiles(PATH, "*.*", SearchOption.AllDirectories).Where(s => s.Contains(CONFIG_NAME)); 
      List<Config> lc = new List<Config>(); 

      foreach (var file in files) 
      { 
       Config config = JsonConvert.DeserializeObject<Config>(File.ReadAllText(file)); 
       lc.add(config); 
      } 

謝謝您的時間

+1

提供更多合理的代碼:目前你有一個變量的作用域是在一個循環中看不見的。所以你的代碼自然沒有任何操作。 – zerkms

+0

然後'Enumerable.Select()'是你所需要的 – zerkms

+0

我已經添加了'lc.add()'來給出一個更好的主意。基本上我希望能夠把這整個事情放在一個LINQ查詢中。 – b85411

回答

2
var configs = 
    Directory 
    .GetFiles(PATH, "*.*", SearchOption.AllDirectories) 
    .Where(s => s.Contains(CONFIG_NAME)) 
    .Select(x => JsonConvert.DeserializeObject<Config>(File.ReadAllText(x))); 
+0

完美,謝謝。 (我還添加了.ToList(),以便能夠顯式鍵入configs) – b85411

+0

當前結果應鍵入'IEnumerable ' –

1

.ForEachList<T>的方法。因此,您需要先對謂詞調用.ToList(),然後才能致電.ForEach(),因爲當前您正在返回投影,而不是實際列表。

這就是說,這實際上並沒有給你想要的東西,因爲.ForEach()返回void。你想要.Select()

var configs = Directory.GetFiles(PATH, "*.*", SearchOption.AllDirectories) 
       .Where(s => s.Contains(CONFIG_NAME)) 
       .Select(x => JsonConvert.DeserializeObject<Config>(x.ReadAllText(x))) 
       .ToList(); 
0

我想沿着這東西行會的工作:

var result = (from f 
       in Directory.GetFiles(PATH, "*.*", SearchOption.AllDirectories) 
       where f.Contains(CONFIG_NAME) 
       select JsonConvert.DeserializeObject<Config>(File.ReadAllText(f))).ToList(); 
0

使用。選擇()方法(Docs

所以,你的代碼將是:

var files = Directory.GetFiles(PATH, "*.*", SearchOption.AllDirectories).Where(s => s.Contains(CONFIG_NAME)); 
var configs = files.Select(f => JsonConvert.DeserializeObject<Config>(File.ReadAllText(f))); 

或在一行

var configs = Directory.GetFiles(PATH, "*.*", SearchOption.AllDirectories).Where(s => s.Contains(CONFIG_NAME)).Select(f => JsonConvert.DeserializeObject<Config>(File.ReadAllText(f)));