为什么没有被迭代的Dictionary集合被视为只读?

时间:2015-05-14 21:22:54

标签: c# dictionary collections html-parsing key-value

我正在尝试使用以下代码解析HTML表的内容。当我尝试更新rowVals集合中的元素时,会出现我的问题:它告诉我该值是只读的。

有些行跨越多列,因此我想确保在解析表时将单元格值映射到相应的列。

我知道当集合被迭代时,它会在你尝试更新该集合时窒息。由于我不是通过rowVals集合进行迭代,而是通过另一个集合进行迭代,因此当我尝试在rowVals中设置特定KVP元素的值时,我不明白为什么我的代码会窒息。任何人都可以建议一种方法来完成设置适当的值而无需添加/删除现有的KVP吗?

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(filePath);

        var root = doc.DocumentNode.Descendants().First(t => t.Name == "body");
        var tables = root.Descendants().Where(t => t.Name == "table");
        var trs = tables.First().Elements("tr");
        //parse the headers
        var headers = trs.First().Elements("th").Select(t => t.InnerText);

        //parse the column values
        var cells = trs.Skip(1).Select(tr => tr.Elements("td"));


        //update the column values for each row
        foreach (var item in cells)
        {
            int x = 0;

            var rowVals = headers.ToDictionary(t => t, t=>"");

            foreach (var item2 in item)
            {
                rowVals.ElementAt(x).Value = item2.InnerText;


                if (item2.Attributes.Any(t => t.Name == "colspan"))
                {
                    x = x + int.Parse(item2.Attributes.First(t => t.Name == "colspan").Value) - 1;
                }
                else
                {
                    x++;
                }
            }



        }

1 个答案:

答案 0 :(得分:3)

您永远不能设置KeyValuePair的值,因为the property is read only开头。这个问题与集合迭代无关。

其次,词典不保证项目的顺序,所以使用.ElementAt()无论如何都没有意义。