繁体   English   中英

C# 以特殊方式将列表的元素添加到二维数组

[英]C# Adding elements of a List to a 2 dimensional Array in a special way

我的问题如下(C# 环境):我在 HTML 文档中有一个表格。 我使用 HTMLAgilityPack 和正则表达式提取了表格。 所有单元格都保存在字符串列表中。 现在我想将这些表保存在一个二维数组中,就像一个普通表一样。 问题是,行的长度不同。 表格是这样写的(...点是空格):

| 啊! 123 | 第456章

| ....... | 986 | 第468章

| bbb | 507 | 206 |

| ........ | 450 | 256 |

第一列中的“aaa”适用于第一行和第二行,“bbb”适用于第 3 行和第 4 行,依此类推。 现在我需要某种逻辑来告诉数组以正确的方式从列表中填充它,例如:

| 啊! 123 | 第456章

| 啊! 986 | 第468章

| bbb | 507 | 206 |

| bbb | 450 | 256 |

这些想法都不是固定的,我们不必使用列表或数组,这些只是我的第一个想法。 如果您对填充数组的逻辑或完全不同但更好的方法有想法,我将非常感激!

重要编辑:丢失的单元格可能在表格的任何列中,而不仅仅是在第一个位置!!! 喜欢:

| 啊! 123 | 第456章

| 啊! ....... | 第468章

| bbb | 507 | 206 |

| bbb | 450 | ....... |

现在第二行的点属于“123”,最后一行的点属于“206”。

        string[,] DataArray = new string[4, 3]; // just an example size for the table above
     List<string> Data = new List<string>(); // the cells from the HTML table are saved here

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(myHtmlDoc);

        foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
        {
            foreach (HtmlNode row in table.SelectNodes("tr"))
            {
                foreach (HtmlNode cell in row.SelectNodes("th|td"))
                {
                    Data.Add(cell.InnerText);
                }
            }
        }
        
        for (int i = 0; i < DataArray.GetLength(0); i++)
        {
            for (int j = 0; j < DataArray.GetLength(1); j++)
            {                                  
                // some logic in here to pick the right part of the List and put it in the 
                // right position in the Array
            }
        }

这是一个适用于您使用 Linq 并返回字典的解决方案。 我很抱歉,我很感激,如果您是 C# 新手,这可能没有多大意义。 我也许可以稍后回来并添加更多解释。

我假设这些值可以解析为 int。 无法解析为 int 的值在此解决方案中被简单地丢弃。

string runningKey = "";

Dictionary<string, List<int>> dictionary =
    doc.DocumentNode.SelectNodes("//table")
        .SelectMany(t => t.SelectNodes("tr"))
        .Select(tr => tr.SelectNodes("td|th").ToList())
        .Where(tds => tds.Any())
        .Select(
            (tds) =>
            {
                runningKey = string.IsNullOrWhiteSpace(tds.First().InnerText) ? runningKey : tds.First().InnerText;

                return
                    new
                    {
                        Key = runningKey,
                        Values =
                            tds
                                .Skip(1)
                                .Select(td => int.TryParse(td.InnerText, out int result) ? result : -1)
                                .Where(n => n != -1)
                                .ToList()
                    };
            })
        .GroupBy(v => v.Key)
        .ToDictionary(g => g.Key, g => g.SelectMany(v => v.Values).ToList());

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM