簡體   English   中英

從單個DataTable以樹形圖形式獲取DataTable

[英]Getting DataTables in tree diagram form from a single DataTable

我有一個DataTable,其中包含以下列:類型,名稱,年份,版本。 我想要包含唯一組合的DataTables。 該表首先分為多個具有唯一名稱+年份組合的表。 這些表需要再次拆分為具有唯一類型的表。 共有4種類型,8種不同的名稱+年份組合。 所以我試圖從一個Datatable中提取總共64個Datatables。

我試圖先獲得名稱+年份的獨特組合。 我已將它們添加到列表(包含name和Datatable的類)中,如果原始表中的一行包含該組合,我將其添加到新的DataTable中。

DataTable distinctTable = table.DefaultView.ToTable(true, new string[] { name,year });

foreach(var combo in distinctTable) 
{
        complexlist.add(new ComplexList(row[name].ToString() + row[year].ToString()){table = table.Clone()});
}
            foreach (DataRow row in table.Rows)
        {
            foreach(var item in complexlist)
            {

                if(item.Name == row[name].ToString() + row[year].ToString())
                {
                    item.table.Rows.Add(row.ItemArray);
                }
            }
        }

現在我有8個不同的表,並且幾乎必須再次執行相同的過程以按類型拆分。

有沒有更清潔,更簡單的方法來做到這一點?

這是一個linq解決方案。 我很久沒有使用DataTables,通常我會將數據轉換為DomainObjects或Models,然后在綁定到UI之前使用它們。


        class DomainObject
        {
            public string Name { get; set; }
            public int Year { get; set; }
            public string Type { get; set; }
            public string Version { get; set; }
        }
        class GroupedDomainObject
        {
            public string Name { get; set; }
            public int Year { get; set; }
            public string Type { get; set; }
            public IEnumerable<string> Versions { get; set; }
        }

        private IEnumerable<GroupedDomainObject> ConvertDataTableToGroupedDomainObject(DataTable dataTable)
        {
            IEnumerable<DomainObject> complexList = dataTable.Select()  // DataTable Select turns it into an IEnumerable
                .Select(r => new DomainObject  // a linq Select turns it into your DomainObject
                {
                    Name = r["Name"].ToString(),
                    Year = Convert.ToInt16(r["Year"]),
                    Type = r["Type"].ToString(),
                    Version = r["Version"].ToString()
                });

            // now use linq GroupBy to turn it into (your 64) distinct Groups
            return complexList.GroupBy(i => new { i.Name, i.Year, i.Type }, (key, items) => new GroupedDomainObject
            {
                Name = key.Name,
                Year = key.Year,
                Type = key.Type,
                Versions = items.Select(o => o.Version)
            });

        }

        private void testConversionToGroupedDomainObject()
        {
            var mike = new DataTable();
            mike.Columns.Add("Name", typeof(string));
            mike.Columns.Add("Year", typeof(int));
            mike.Columns.Add("Type", typeof(string));
            mike.Columns.Add("Version", typeof(string));
            mike.Rows.Add("NameOne", 2019, "TypeA", "Version1");
            mike.Rows.Add("NameOne", 2018, "TypeB", "Version2");
            mike.Rows.Add("NameOne", 2018, "TypeB", "Version3");
            mike.Rows.Add("NameOne", 2018, "TypeB", "Version4");
            mike.Rows.Add("NameTwo", 2019, "TypeA", "Version1");
            mike.Rows.Add("NameTwo", 2018, "TypeB", "Version2");
            mike.Rows.Add("NameTwo", 2018, "TypeB", "Version3");
            mike.Rows.Add("NameTwo", 2018, "TypeB", "Version4");

            var result = ConvertDataTableToGroupedDomainObject(mike);

            Debug.Assert(mike.Rows.Count == result.Select(r => r.Versions).Count());
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM