数据表具有以下的列名:转换数据表的给词典<字符串,StringBuilder的>
Name, Value, Type, Info
需要转换的结构字典
其中name是密钥(字符串)和其他值将被追加到像StringBuilder那样的“Value,Type,Info”,然而它有可能具有重复的Name列值,那么对StringBuilder连续的每个附加值将使用分隔符如?:来描述下一组值。
对于例如:如果数据表的数据是这样的:
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}
}
这是很容易使用循环来达到相同的,但我是尝试通过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)
此代码不照顾repet的itive键和附加,可能我需要使用SelectMany来扁平化结构,但是如何在向我提供上面指定的需求的字典时起作用,以便可以将分隔符添加为现有密钥的值。任何可以指引我正确方向的指针。
为什么'StringBuilder'为'Value'? – VMAtm 2015-03-19 12:24:03
这是为了方便附加字符串而不是使用类似String.Join的东西。这将是有效的 – 2015-03-19 12:29:22
@MrinalKamboj您是否打算在创建字典后添加任何内容?如果不是,那么'StringBuilder'可能不是非常有用的结果类型。另外,不要假设'string.Join'比没有Bench Benchmark的'StringBuilder'效率低。对于你所知道的'string.Join'使用'StringBuilder'或者更好的东西。 – juharr 2015-03-19 12:51:46