繁体   English   中英

将foreach转换为LINQ查询(C#)的一部分

[英]Convert foreach to be part of LINQ query (C#)

我目前有一个LINQ查询来获取一些JSON文件,然后运行一个foreach循环将JSON转换为对象。 最终,我希望有一个可以使用的List<Config>

有什么方法可以将其组合到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);
            }

感谢您的时间

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

.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();

我认为与此类似的东西会起作用:

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

使用.Select()方法( 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)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM