我的列表包含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);
感谢。
吨。
答案 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