使用LINQ来扁平化分层数据集-有一个警告

本文关键字:有一个 警告 数据集 分层 LINQ 扁平化 使用 | 更新日期: 2023-09-27 17:54:29

我有以下数据集,我需要扁平化成一个列表:

<row itemID="828518871" locationID="60004165" typeID="9331" quantity="6" flag="4" singleton="0"/>
<row itemID="830476364" locationID="60004165" typeID="649" quantity="1" flag="4" singleton="1">
  <rowset name="contents" key="itemID" columns="itemID,typeID,quantity,flag,singleton">
    <row itemID="1139985051" typeID="6485" quantity="1" flag="22" singleton="1"/>
    <row itemID="1773489170" typeID="11489" quantity="1" flag="5" singleton="1">
      <rowset name="contents" key="itemID" columns="itemID,typeID,quantity,flag,singleton">
        <row itemID="1001694072954" typeID="16357" quantity="1" flag="0" singleton="0"/>
        <row itemID="1001694110421" typeID="16371" quantity="1" flag="0" singleton="0"/>
        ...
      </rowset>
    </row>
  </rowset>
  </row>

(...表示额外的行和/或嵌套级别;理论上可以无限嵌套。)

输出需要像这样:

Item { ID = 828518871, Location = 60004165, Type = 9331, Quantity = 6, Flag = 4, Singleton = false }
Item { ID = 830476364, Location = 60004165, Type = 649, Quantity = 1, Flag = 4, Singleton = true }
Item { ID = 1139985051, Location = 60004165, Type = 6485, Quantity = 1, Flag = 22, Singleton = true }
Item { ID = 1773489170, Location = 60004165, Type = 11489, Quantity = 1, Flag = 5, Singleton = true }
Item { ID = 1001694072954, Location = 60004165, Type = 16357, Quantity = 1, Flag = 0, Singleton = false }
Item { ID = 1001694110421, Location = 60004165, Type = 16371, Quantity = 1, Flag = 0, Singleton = false }
...

问题在于输出中的所有行都需要正确设置它们的LocationID -子行必须从它们的父行或它们的父行等处获得此属性。

我已经写了一个递归方法,正确地生成所需的输出,但我想只使用LINQ获得相同的结果-这是可能的吗?

使用LINQ来扁平化分层数据集-有一个警告

对于任意递归,LINQ通常不是很好。使用SelectMany平坦化一个嵌套层是可以的,但是递归解决方案仍然需要显式地调用自己。例如,你可以编写一个使用LINQ并在查询中调用自己的方法,但是你不能轻易地让LINQ隐式地执行递归。

所以你可以调整你现有的递归方法来使用LINQ,但你不太可能最终得到一个完全不同的解决方案结构。

我在前一段时间为IEnumerable<T>接口编写了一个名为SelectRecursive的小扩展方法,您可以使用它来创建递归linq查询。http://www.codeproject.com/Tips/80746/Select-Recursive-Extension-method.aspx