zoukankan      html  css  js  c++  java
  • 在C#中用Linq从属性文件中读取键值对Key-Value Pair

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

    Name = Dawei XU
    Email = dawei.xu@gmail.com

    在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 = dawei.xu@hotmail.com
    Name = Dawei XU
    Email = dawei.xu@gmail.com

    就会抛出 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());
  • 相关阅读:
    [PA2014]Muzeum
    [AMPPZ2014]Jaskinia
    [PA2015]Rozstaw szyn
    LOJ 6713 「EC Final 2019」狄利克雷 k 次根 加强版
    Problem. R
    51nod 2583 数论只会Gcd
    51nod 1847 奇怪的数学题
    51nod 1575 Gcd and Lcm
    Problem. Q
    CF868G El Toll Caves
  • 原文地址:https://www.cnblogs.com/sjqq/p/6889921.html
Copyright © 2011-2022 走看看