LINQ to XML将null项添加到对象列表

时间:2012-12-06 08:23:46

标签: c# xml linq

我的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个国家,但我还得到一个额外的空对象作为列表的最后一项。

enter image description here

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

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

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

Internal structure of List

答案 1 :(得分:1)

我们可以使用 TrimExcess 方法来减少与计数相匹配的容量,但如果您的元素少于4个,则无法使用,例如当前问题。

相关链接:
Capasity 方法 - 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
关于默认容量 - Default Capacity of List

的问题