首页>Program>source

我有以下字符串

MyKey1=MyVal1
 MyKey2=MyVal2
 MyKey3=MyVal3
 MyKey3=MyVal3

因此,首先,需要分割成几行,然后我需要用' =分割每行 'char以从该行获取键和值.结果,我想要的是一个 List<KeyValuePair<string, string>>   (为什么不是 Dictionary ? =>列表中可能有重复的键),所以我不能使用 .ToDictionary()   扩展名。

我非常类似以下内容:

List<KeyValuePair<string, string>> fields =
    (from lines in Regex.Split(input, @"\r?\n|\r", RegexOptions.None)
    where !String.IsNullOrWhiteSpace(lines)
    .Select(x => x.Split(new [] { '='}, 2, StringSplitOptions.RemoveEmptyEntries))
    .ToList()
    --> select new KeyValuePair? Or with 'let' for splitting by '='?
        what about exception handling (e.g. ignoring empty values)
最新回答
  • 1月前
    1 #

    您非常接近(出于一致性考虑,我将示例更改为所有方法语法):

    List<KeyValuePair<string, string>> fields =
        Regex.Split(input, @"\r?\n|\r", RegexOptions.None)
        .Where(s => !String.IsNullOrWhiteSpace(s))
        .Select(x => x.Split(new [] {'='}, 2, StringSplitOptions.RemoveEmptyEntries)
        .Where(p => p.Length == 2)  // to avoid IndexOutOfRangeException
        .Select(p => new KeyValuePair(p[0], p[1]));
    

    尽管我同意乔恩(Jon)的评论,即如果您有重复的键,则分组会更干净:

    IEnumerable<IGrouping<string, string>> fields =
        Regex.Split(input, @"\r?\n|\r", RegexOptions.None)
        .Where(s => !String.IsNullOrWhiteSpace(s))
        .Select(x => x.Split(new [] {'='}, 2, StringSplitOptions.RemoveEmptyEntries))
        .GroupBy(p => p[0]);
    

  • 1月前
    2 #

    如果您担心重复的键,可以使用 ILookup   代替:

    var fields =
        (from line in Regex.Split(input, @"\r?\n|\r", RegexOptions.None)
         select line.Split(new [] { '=' }, 2))
        .ToLookup(x => x[0], x => x[1]);
    var items = fields["MyKey3"]; // [ "MyVal3", "MyVal3" ]
    

  • 1月前
    3 #

    您可以使用 Lookup<TKey, TValue>   而不是字典:

    var keyValLookup = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
        .Select(l =>
        {
            var keyVal = l.Split('=');
            return new { Key = keyVal[0].Trim(), Value = keyVal.ElementAtOrDefault(1) };
        })
        .Where(x => x.Key.Length > 0)  // not required, just to show how to handle invalid data
        .ToLookup(x => x.Key, x => x.Value);
    IEnumerable<string> values = keyValLookup["MyKey3"];
    Console.Write(string.Join(", ",values)); // MyVal3, MyVal3
    

    即使键不存在,查找也总是返回一个值.然后是一个空序列.密钥不能唯一,因此在使用 ToLookup之前无需分组或删除重复项 .

  • 1月前
    4 #

    我建议您尝试匹配键/值而不是拆分.如果您想要一个包含多个键值的字典,则可以使用 ToLookup   (一个 ILookup ):

    var result = Regex.Matches(input, @"(?<key>[^=\r\n]+)=(?<value>[^=\r\n]+)")
                      .OfType<Match>()
                      .ToLookup(m => m.Groups["key"].Value, 
                                m => m.Groups["value"].Value);
    

    如果您以后需要添加到该列表或希望继续使用列表:

    var result = Regex.Matches(input, @"(?<key>[^=\r\n]+)=(?<value>[^=\r\n]+)")
                      .OfType<Match>()
                      .Select(m => new KeyValuePair<string, string>(m.Groups["key"].Value, m.Groups["value"].Value))
                        .ToList();
    

    注意:由于我们不知道您可能输入的内容,因此使用的正则表达式可能不适合您的使用。

  • c#:在aspnet MVC中部署特定的资源?
  • 如何在颤动中将画廊图像传递到另一个Statefull屏幕