Расщепление иерархий от данных - PullRequest
0 голосов
/ 02 мая 2018

У меня есть таблица данных, которая содержит несколько иерархий с разной высотой, которые мне нужно разделить.

например.

|---------------------|------------------|
|      Account        | Hierarchy Account|
|---------------------|------------------|
|          1          |                  |
|---------------------|------------------|
|          2          |         1        |
|---------------------|------------------|
|          3          |         1        |
|---------------------|------------------|
|          4          |         2        |
|---------------------|------------------|
|          5          |         3        |
|---------------------|------------------|
|          6          |                  |
|---------------------|------------------
|          7          |         6        |
|---------------------|------------------|
|          8          |         6        |
|---------------------|------------------|

Ниже я попробовал до сих пор.

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;
        }

Мой мыслительный процесс, описанный выше, заключался в том, чтобы сначала найти самые высокие учетные записи в иерархии, создать новые таблицы данных с этими учетными записями, а затем развернуть детализацию и рекурсивно добавить следующие уровни в соответствующие данные, так как я не знаю высоту каждой иерархии.

1 Ответ

0 голосов
/ 02 мая 2018

Нашел решение, создав tempList, который хранит все нижние уровни при поиске на уровне выше. Как только цикл в SearchList завершен, мы назначаем ему tempList. А затем выполните поиск на следующем уровне иерархии.

       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();
            }
        }
...