【问题标题】:append string in List<String> contained in a dictionary using LINQ使用 LINQ 在字典中包含的 List<String> 中追加字符串
【发布时间】:2023-03-20 07:34:01
【问题描述】:

我有一个包含字段类型对象的列表,即List&lt;Field&gt;,我的字段类定义如下:

Public Class Field
{
   public string FieldName { get; set; }
   public string FieldValue { get; set; }
}

然后这个列表被转换成Dictionary&lt;string, List&lt;string&gt;&gt;类型的字典

Dictionary<string, List<string>> myResult = 
       myFieldList.Select(m => m)
      .Select((c, i) => new { Key = c.FieldName, value = c.FieldValue })
      .GroupBy(o => o.Key, o => o.value)
      .ToDictionary(grp => grp.Key, grp => grp.ToList());

我想使用 Linq 将列表中包含的字符串值附加为单个字符串,因此从技术上讲,上面定义的字典应该定义为 Dictionary&lt;string, string&gt;,但在附加时我需要几个额外的步骤。

我需要在每个要附加的值前面添加\r\n,并且如果值为空,我需要确保这些值(包括新行)不会被附加,即

value += (string.IsNullOrEmpty(newval) ? string.Empty : '\r\n' + newVal);

谢谢。

T.

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 我尝试过使用 Aggregate 但我似乎无法正确使用。我要么可以访问列表,要么可以访问字符串,但无论哪种方式,我都不确定将它放在我的 linq 查询中的哪个位置。

标签: c# linq


【解决方案1】:

也许这就是你想要的:

var myResult = myFieldList.GroupBy(o => o.FieldName, o => o.FieldValue)
  .ToDictionary(grp => grp.Key, grp => string.Join("\r\n", 
                                       grp.Where(x=>!string.IsNullOrEmpty(x))));

【讨论】:

    【解决方案2】:

    grp.ToList() 替换为采用一系列字符串并以您想要的方式将其组合在一起的逻辑。

    您需要的关键方法是 .Where 忽略项目(即空值)和 string.Join 使用自定义连接符(即换行符)将字符串连接在一起。

    顺便说一句,您应该使用Environment.NewLine 而不是'\r\n' 以使您的代码更便携。

    【讨论】:

    • 有趣的是,您应该提到即 Environment.NewLine... 在这里我将其删除,认为这是新手的编码方式,但我总是使用它! :) 并感谢您的推荐。你和国王一样在现场!
    【解决方案3】:

    代替 ToDictionnary 的元素选择器中的 grp.ToList(),将所有内容聚合到一个字符串中(仅当您有合理数量的字符串时才这样做,而不是非常高的字符串,因为它会降低性能) //替换这个 grp.ToList()

    // With this
    grp
        .Where(s=>!string.IsNullOrEmtpy(s)) // drop the empty lines
        .Aggregate((a,b)=>a+'\r\n'+b) // Aggregate all elements to a single string, adding your separator between each
    

    【讨论】:

    • string.Join 相比,这明显效率较低。二次而不是线性。
    • 是的,我知道,但在大多数情况下确实无关紧要(通常你要总结 3-4 个字符串),这就是为什么我提到如果你正在处理大型集合,不要使用它。我真的是出于习惯使用它,因为我在字符串之外使用大量聚合,并且在连接不够灵活的字符串中使用,但在这种情况下,连接解决方​​案肯定会更好。
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 2013-03-30
    • 2016-02-23
    • 2013-11-14
    • 2013-03-14
    • 2016-06-20
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多