使用LINQ </string>在字典中包含的List <string>中追加字符串

时间:2013-11-30 04:19:03

标签: c# linq

我的列表包含Field类型的对象,即List<Field>,我的字段类定义如下:

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

然后将此列表转换为类型Dictionary<string, List<string>>

的字典
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<string, string>,但在追加时我还需要一些额外的步骤。 / p>

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

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

感谢。

吨。

3 个答案:

答案 0 :(得分:2)

也许这就是你想要的:

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

答案 1 :(得分:1)

grp.ToList()替换为采用一系列字符串的逻辑,并以您希望的方式将它们放在一起。

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

顺便说一句,您应该使用Environment.NewLine代替'\r\n'来保持代码的便携性。

答案 2 :(得分:1)

而不是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