C#学习教程:Linq:将扁平结构转化为层次结构object[][]{{“A1”,“B1”,“C1”},{“A1”,“B1”,“C2”},{“A2”,“B2”,“C3”},{“A2","B2","C4"}//..更多};进入层次结构:classX{publicX(){Cs=newList();}公共字符串A{得到;放;}公共字符串B{得到;放;}publicListCs{get;私有集;}}结果应该像这样//描述结构的伪代码:result={newX(){A="A1",B="B1",Cs={"C1","C2"}},newX(){A="A2",B="B2",Cs={"C3","C4"}}}最好使用Linq扩展方法。目标类X可以更改(例如列表的公共设置器),只有在现在不可能/有用的情况下。对于这种特殊情况:.GroupBy(x=>new{a=x[0],b=x[1]}).Select(x=>new{A=x.Key.a,B=x.Key.b,C=x.Select(c=>c[2])})如果您的层次结构深度有限,那么这样的事情应该可行(如您的示例中只有三个级别A、B和C)。我简化了你的X:classX{publicstringA{get;放;}公共字符串B{得到;放;}publicListCs{get;放;然后,您可以使用嵌套的GroupBy(取决于层次结构的深度)。将其重写为递归方法也相对容易(适用于任意深度的层次结构)://Groupby'A'rawData.GroupBy(aels=>aels[0]).Select(a=>//Groupby'B'a.GroupBy(bels=>bels[1]).Select(b=>//为当前分组生成'X'类型的结果newX{A=a.Key,B=b.Key,//取第三个元素Cs=b.Select(c=>c[2]).ToList()}));这比其他解决方案更明确,但也许它更具可读性,因为它更直接地编码想法......如果X成员是字符串,Cs是私有集,而rawData是对象数组的数组,我会添加一个X的构造函数publicX(stringa,stringb,Listcs)publicX(stringa,stringb,Listcs)然后执行这段代码varquery=fromrowinrawDatagrouprowbynew{A=row[0],B=row[1]}intorowgroupselectnewX((string)rowgroup.Key.A,(string)rowgroup.Key.B,rowgroup.Select(r=>(string)r[2]).ToList());这是基于以下原始数据object[][]rawData=newobject[][]{newobject[]{"A1","B1","C1"},newobject[]{"A1","B1","C2"},newobject[]{"A2","B2","C3"},newobject[]{"A2","B2","C4"}//..更多};我想看看我是否可以在没有匿名实例的情况下编写这段代码。这还不错:以上是C#学习教程:Linq:Convertingaflatstructuretoahierarchicalstructure。如果对大家有用,需要详细了解C#学习教程,希望大家多加关注—IEnumerablemyList=fromraw0inrawDatagroupraw0byraw0[0]intog0letg1s=(fromraw1ing0groupraw1byraw1[1])fromg1ing1sselectnewX(){A=g0.Key,B=g1.Key,C=g1.Select(raw2=>raw2[2]).ToList()}本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
