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