1

我的xml:

  <Configuration>
    <LaunchDebugger>false</LaunchDebugger>
    <RequestFolder>./Request</RequestFolder>
    <ResponseFolder>./Response</ResponseFolder>
    <Countries>
      <Country NumericCode="1FH" FileName="file1.xml">1</Country>
      <Country NumericCode="20H" FileName="file2.xml">2</Country>
      <Country NumericCode="" FileName="file3.xml">3</Country>
    </Countries>
  </Configuration>

国家级:

public class Country
{
    public String Name { get; set; }
    public String NumericCode { get; set; }
    public String FileName { get; set; }
}

这就是我使用 LINQ 从它创建对象的方式:

    CountryList = (from filter in Configuration.Descendants("Countries").Descendants("Country")
                    select new Country() 
                    {
                        Name = (string)filter.Value,
                        NumericCode = (string)filter.Attribute("NumericCode"),
                        FileName = (string)filter.Attribute("FileName")
                    }).ToList();

解析 xml 有效,我在列表中获得了所有 3 个国家,但我还获得了一个额外的空对象作为列表的最后一项。

在此处输入图像描述

知道为什么会这样吗?

4

2 回答 2

4

原因很简单 -List<T>默认容量等于4。Capacity获取或设置内部数据结构在不调整大小的情况下可以容纳的元素总数。内部数据结构是一个简单的数组private Country[] _items,最初的长度等于 4。因此为第四个元素保留了位置,在分配元素之前为空。但不要担心 -3如果您检查,元素计数将是。

这是一张图片,显示了公共(三个项目)和内部数据结构(容量大小的数组)

List的内部结构

于 2012-12-06T08:30:45.177 回答
1

我们可以使用TrimExcess方法来减少匹配计数的容量,但是如果您的元素少于 4 个,这将不起作用,就像在当前问题中一样。

相关链接: 容量法 - http://msdn.microsoft.com/en-us/library/y52x03h2(v=vs.100).aspx
TrimExcess方法 - http://msdn.microsoft.com/en-us/library /ms132207(v=vs.100).aspx关于默认容量的问题-列表的默认容量

于 2012-12-06T09:43:42.727 回答