• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

在C#中用Linq从属性文件中读取键值对Key-ValuePair

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我们经常需要读取一些如下的属性文件,然后把他们放到一个Dictionary里面。

Name = Dawei XU
Email = [email protected]

在C#中可以用Linq很方便的实现这个功能。先看代码:

File.ReadAllLines(fileName)
.Select(line => line.Split(new[] {'='}, 2, StringSplitOptions.RemoveEmptyEntries))
.Where(split => split.Length == 2)
.ToDictionary(split => split[0].Trim(), split => split[1].Trim());

用到了如下Linq扩展方法:

  • Enumerable.Select ,用来对每一行做split操作,分隔出Key和Value。注意这里要写上分隔成两段。另外要 StringSplitOptions.RemoveEmptyEntries 。
  • Enumerable.Where ,用来过滤到不符合Key-Value的行。
  • Enumerable.ToDictionary ,把分隔成两段的第一段作为Key,第二个作为Value存在Dictionary里面。

但是这个做法有一个潜在的问题,就是如果属性文件中有重复的Key出现,比如:

Email = [email protected]
Name = Dawei XU
Email = [email protected]

就会抛出 ArgumentException

An element with the same key already exists in the Dictionary .

解决办法就是用 Enumerable.GroupBy 把重复的Key合并在一起,然后可以根据需要使用第一次出现的或者最后一次出现的,下面的例子是采用最后一次出现的。同时因为用了 GroupBy ,最后的 ToDictionary 需要做一些相应的修改。

File.ReadAllLines(fileName)
.Select(line => line.Split(new[] {'='}, 2, StringSplitOptions.RemoveEmptyEntries))
.Where(split => split.Length == 2)
.GroupBy(split=>split[0].Trim())
.ToDictionary(group => group.Key.Trim(), group => group.Last().Last().Trim());

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#解析ntfs下的$usnjrnl($J)文件发布时间:2022-07-13
下一篇:
C#类的序列化和反序列化发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap