我用这种方式有一个复杂的数据
<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>
而不是父数据类型<Data2>
。
分组后如何将子数据类型转换为父数据类型
如何在for each循环中实现。
如果您需要对复杂的数据进行分组,那么您应该在Linq中使用GroupBy,而不是为每个循环使用for或
在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
如果我正确理解你的帖子,你正在寻找这样的东西:
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));