我需要将以下数据集压缩成一个列表:
<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得到相同的结果 - 这可能吗?
答案 0 :(得分:6)
LINQ对于任意递归通常都不好。使用SelectMany
展平一个嵌套层很好,但递归解决方案仍然需要显式调用它们。例如,您可以编写一个使用LINQ并在查询中调用自身的方法,但是您无法轻易地使LINQ隐式执行递归。
因此,您可以调整现有的递归方法以使用LINQ,但是您不太可能最终得到与解决方案完全不同的结构。
答案 1 :(得分:2)
我前段时间向SelectRecursive
接口编写了一个名为IEnumerable<T>
的小扩展方法,您可以使用它创建递归的linq查询。
http://www.codeproject.com/Tips/80746/Select-Recursive-Extension-method.aspx