我有这种方式的复杂数据
<Complex Data>
<Data Level 1>..........</Data> (only single row)
<Data>...................(n rows)
<Data 2a>............</Data> (only single row)
<Data 2b>............</Data> (n row)
<Id></Id>.....................(unique key)
</Data2>
</Complex Data>
我有一个复杂的数据LIST<COMPLEX DATA>
。我需要使用<Data 2a.......eg: Place> </Data2a>
我尝试实现此功能,但我只获得父数据类型为<Data 2a>
的{{1}}子数据类型。
如何在分组后将此子数据类型转换为父数据类型
我如何在每个循环中实现这一点。
答案 0 :(得分:0)
如果您需要对复杂数据进行分组,那么您应该在Linq中使用GroupBy而不是使用for或for each循环
在http://msdn.microsoft.com/en-us/vbasic/bb738046有一些简单的小组例子 - 第一个例子(在VB中)应该涵盖你需要的东西吗?
或者,LinqToXml分组的本教程非常好:http://msmvps.com/blogs/martin_honnen/archive/2009/11/27/grouping-with-linq-to-xml.aspx
答案 1 :(得分:0)
如果我理解你的帖子,你正在寻找这样的东西:
var grouping = source
.SelectMany(x => x.Items.Select(y => Tuple.Create(x, y))
.SelectMany(t1 => t1.Item2.Items.Select(z => Tuple.Create(t1.Item1, z))
.GroupBy(t2 => t2.Item2, t2 => t2.Item1);
如果你想投影它有点难看,但是这样保持对源元素的引用......
Item1是您的补全数据,Item2是您当前的投影。嵌套的foreach循环使其更具可读性:
IEnumerable<Tuple<K, TSource>> SelectManyKeys(IEnumerable<TSource> source)
{
foreach (var x in source)
{
foreach (var k in x.Items.SelectMany(z => z.Items))
{
yield return Tuple.Create(k, x);
}
}
}
var grouping = SelectManyKeys(source).GroupBy(t => t.Item1, t => t.Item2));