C# 从数据表拆分层次结构

C# 从数据表拆分层次结构,c#,datatable,hierarchy,C#,Datatable,Hierarchy,我有一个datatable,它包含多个不同高度的层次结构,我需要拆分这些层次结构 例如 以下是我到目前为止所做的尝试 private List<DataTable> SplitDataTablesOnHierarchy(DataTable dataTable) { List<DataTable> dataTablesList = new List<DataTable>(); List<str

我有一个datatable,它包含多个不同高度的层次结构,我需要拆分这些层次结构

例如

以下是我到目前为止所做的尝试

private List<DataTable> SplitDataTablesOnHierarchy(DataTable dataTable)
        {
            List<DataTable> dataTablesList = new List<DataTable>();
            List<string> listTemp = new List<string>();

            var HierarchyAccounts = dataTable.AsEnumerable().Where(m => m.Field<string>("Hierarchy Account Number") == "");

            foreach(var topAccount in TopAccounts )
            {
                //Check if account exists in Hierarchy Account Number
                var topAccountExists = dataTable.AsEnumerable().Any(m => m.Field<string>("Hierarchy Account Number") == topAccount.Field<string>("Account Number"));
                if (topAccountExists == true)
                {
                    DataTable newDataTable = dataTable.Clone();
                    newDataTable.ImportRow(payerAccount);
                    dataTablesList.Add(newDataTable);
                }
                //Top Accounts found and added to tempList
            }
            //CreateDataTable with Top Accounts
            foreach(DataTable dTable in dataTablesList)
            {
                bool bottomHierarchyReached = true;
                var TempSearch = dTable.Rows;

                while(bottomHierarchyReached)
                {
                    foreach(DataRow account in TempSearch)
                    {
                        var rows = dataTable.AsEnumerable().Where(m => m.Field<string>("Hierarchy Account Number") == account.Field<string>("Account Number")).CopyToDataTable();
                        if(rows.Rows.Count == 0)
                        {
                            bottomHierarchyReached = false;
                            break;
                        }
                        else
                        {
                            TempSearch = rows.Rows;
                            dTable.Rows.Add(rows.Rows);
                        }
                    }
                }
            }

            return dataTablesList;
        }
私有列表拆分DataTablesOnHierarchy(DataTable DataTable)
{
List dataTablesList=新列表();
List listTemp=新列表();
var HierarchyAccounts=dataTable.AsEnumerable()。其中(m=>m.Field(“层次结构帐号”)==”);
foreach(TopAccounts中的var topAccount)
{
//检查层次结构帐号中是否存在帐户
var topcountexists=dataTable.AsEnumerable().Any(m=>m.Field(“层次结构账号”)==topcount.Field(“账号”);
如果(topAccountExists==true)
{
DataTable newDataTable=DataTable.Clone();
newDataTable.ImportRow(payerAccount);
dataTablesList.Add(newDataTable);
}
//找到并添加到tempList的顶级帐户
}
//具有顶级帐户的CreateDataTable
foreach(dataTablesList中的DataTable dTable)
{
bool bottomhierarchyreach=true;
var TempSearch=dTable.Rows;
while(底部层次结构)
{
foreach(TempSearch中的数据行帐户)
{
var rows=dataTable.AsEnumerable()。其中(m=>m.Field(“层次结构账号”)==Account.Field(“账号”)).CopyToDataTable();
if(rows.rows.Count==0)
{
BottomHierarchyReach=false;
打破
}
其他的
{
TempSearch=rows.rows;
dTable.Rows.Add(Rows.Rows);
}
}
}
}
返回数据表列表;
}

我在上面的思考过程是首先在等级体系中找到最高的账户,使用这些帐户创建新的数据表,然后向下钻取并递归地将以下级别添加到相关的数据表中,因为我不知道每个层次结构的高度。

通过创建一个模板列表找到了一个解决方案,该模板列表在搜索上面的级别时保留所有较低级别。
       foreach (DataTable dTable in dataTablesList)
        {
            bool bottomHierarchyReached = true;
            var SearchList = dTable.AsEnumerable().Select(p=> new { HierarchyAccount = p.Field<string>("Hierarchy Account Number"),
                Account = p.Field<string>("Account Number")
            }).ToList();

            var tempList = SearchList.ToList();
            tempList.Clear();

            while (bottomHierarchyReached)
            {
                tempList.Clear();
                foreach (var account in SearchList)
                {
                    var rows = dataTable.AsEnumerable().Where(m => m.Field<string>("Hierarchy Account Number") == account.Account);
                    if(rows.Count() == 0)
                    {
                        bottomHierarchyReached = false;
                        break;
                    }
                    else
                    {
                        tempList.AddRange(rows.AsEnumerable().Select(p => new {
                            HierarchyAccount = p.Field<string>("Hierarchy Account Number"),
                            Account = p.Field<string>("Account Number")
                        }).ToList());

                        foreach(var row in rows)
                        {
                            dTable.ImportRow(row);
                        }
                    }
                }
                SearchList = tempList.ToList();
            }
        }
搜索列表中的循环完成后,我们将圣殿骑士分配给它。 然后搜索层次结构的下一级

       foreach (DataTable dTable in dataTablesList)
        {
            bool bottomHierarchyReached = true;
            var SearchList = dTable.AsEnumerable().Select(p=> new { HierarchyAccount = p.Field<string>("Hierarchy Account Number"),
                Account = p.Field<string>("Account Number")
            }).ToList();

            var tempList = SearchList.ToList();
            tempList.Clear();

            while (bottomHierarchyReached)
            {
                tempList.Clear();
                foreach (var account in SearchList)
                {
                    var rows = dataTable.AsEnumerable().Where(m => m.Field<string>("Hierarchy Account Number") == account.Account);
                    if(rows.Count() == 0)
                    {
                        bottomHierarchyReached = false;
                        break;
                    }
                    else
                    {
                        tempList.AddRange(rows.AsEnumerable().Select(p => new {
                            HierarchyAccount = p.Field<string>("Hierarchy Account Number"),
                            Account = p.Field<string>("Account Number")
                        }).ToList());

                        foreach(var row in rows)
                        {
                            dTable.ImportRow(row);
                        }
                    }
                }
                SearchList = tempList.ToList();
            }
        }
foreach(dataTablesList中的DataTable dTable)
{
bool bottomhierarchyreach=true;
var SearchList=dTable.AsEnumerable().Select(p=>new{HierarchyAccount=p.Field(“层次结构帐号”),
账户=p.字段(“账户号”)
}).ToList();
var templast=SearchList.ToList();
圣殿骑士;
while(底部层次结构)
{
圣殿骑士;
foreach(搜索列表中的var帐户)
{
var rows=dataTable.AsEnumerable()。其中(m=>m.Field(“层次结构帐号”)==Account.Account);
if(rows.Count()==0)
{
BottomHierarchyReach=false;
打破
}
其他的
{
templast.AddRange(rows.AsEnumerable().Select(p=>new{
HierarchyAccount=p.Field(“层次结构帐号”),
账户=p.字段(“账户号”)
}).ToList());
foreach(行中的变量行)
{
dTable.ImportRow(行);
}
}
}
SearchList=templast.ToList();
}
}