【发布时间】:2015-03-19 12:08:56
【问题描述】:
DataTable 具有以下列名称:
Name, Value, Type, Info
需要转换结构字典
其中 Name 是键(字符串),其他值将附加到 StringBuilder,如“Value,Type,Info”,但是可能有重复的 Name 列值,然后连续每个附加到 StringBuilder 的值将使用像 ?: 这样的分隔符来描述下一组值。
例如:如果DataTable数据是这样的:
Name, Value, Type, Info
one 1 a aa
one 11 b bb
two 2 c cc
two 22 dd ddd
two 222 ee eee
现在结果结构应该是这样的:
Dictionary<String,StringBuilder> detail = new Dictionary<String,StringBuilder>
{
{[one],[1,a,aa?:11,b,bb},
{[two],[2,c,cc?:22,dd,ddd?:222,ee,eee}
}
使用 for 循环很容易实现相同的效果,但我试图通过 Linq 来实现,所以我尝试了类似的方法:
datatable.AsEnumerable.Select(row =>
{
KeyValuePair<String,StringBuilder> kv = new KeyValuePair<String,StringBuilder>();
kv.key = row[Name];
kv.Value = row[Value]+","+row[Type]+","+row[Info]
return kv;
}).ToDictionary(y=>y.Key,y=>y.Value)
此代码不处理重复键并因此附加,可能我需要使用 SelectMany 来展平结构,但它如何为我提供具有上述要求的字典,以便可以添加分隔符是现有键的值。任何可以指引我正确方向的指针。
【问题讨论】:
-
为什么
StringBuilder是Value? -
这是为了方便附加字符串,而不是使用像 String.Join 这样的东西。这将是有效的
-
@MrinalKamboj 您打算在创建字典后添加任何内容吗?如果不是,那么
StringBuilder作为结果类型可能不是很有用。也不要假设string.Join的效率低于没有基准标记的StringBuilder。据你所知,string.Join使用StringBuilder或更好的东西。 -
这是一个question,特别是关于
string.Join和StringBuilder。 -
@juharr 在这种情况下是的,一旦创建了 Dictionary,然后对于给定的键,我们将值附加到 StringBuilder 值中。说 SB 高效的想法是考虑到它在这种情况下的用法。我确信在我们的场景中进行基准标记不会有很大的不同
标签: c# .net linq dictionary datatable