LINQ 查询具有分组的复杂数据

发布于 2024-11-05 05:13:55 字数 720 浏览 0 评论 0原文

我以这种方式有一个复杂的数据

<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 。我需要使用 中的元素对这些复杂数据进行分组

我尝试实现这个,但我只得到子数据类型 插入父数据类型

分组后如何将此子数据类型转换为父数据类型

如何在 foreach 循环中实现它。

I have a complex data in this manner

<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>

I have a this complex data LIST<COMPLEX DATA> . I need to group this complex data using a element from <Data 2a.......eg: Place> </Data2a>

I try to implement this but i get only the child data type only <Data 2a> insted of parent data type <Data2>.

how can i convert this child data type into parent data type after grouping

how can i implement this in a for each loop.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月下客 2024-11-12 05:13:55

如果您需要对复杂数据进行分组,那么您应该在 Linq 中使用 GroupBy,而不是使用 for 或 for every 循环

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

If you need to group the complex data, then you should be using GroupBy in Linq and not using a for or for each loop

There are some simple group by examples at http://msdn.microsoft.com/en-us/vbasic/bb738046 - the first example (in VB) should cover what you need?

Alternatively, this tutorial for LinqToXml grouping is quite good: http://msmvps.com/blogs/martin_honnen/archive/2009/11/27/grouping-with-linq-to-xml.aspx

青衫负雪 2024-11-12 05:13:55

如果我正确理解你的帖子,你正在寻找这样的东西:

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));

If I understand your post correctly, you are looking for something like this:

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);

Its a bit ugly if you want to project, but maintain the reference to the source element this way...

The Item1 is your complext data, and Item2 your current projection. A nested foreach loop makes it more readable:

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));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文