C# LINQtoXML将空项添加到对象列表中

C# LINQtoXML将空项添加到对象列表中,c#,xml,linq,C#,Xml,Linq,我的xml: 以下是我如何使用LINQ从中创建对象: public class Country { public String Name { get; set; } public String NumericCode { get; set; } public String FileName { get; set; } } 解析xml是可行的,我得到了列表中的所有3个国家,但我还得到了一个额外的null对象作为列表的最后一项 知道为什么会这样吗?原因很简单-列表的默认容

我的xml:

以下是我如何使用LINQ从中创建对象:

public class Country
{
    public String Name { get; set; }
    public String NumericCode { get; set; }
    public String FileName { get; set; }
}
解析xml是可行的,我得到了列表中的所有3个国家,但我还得到了一个额外的null对象作为列表的最后一项


知道为什么会这样吗?

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

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


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

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


我们可以使用TrimOverse方法来减少容量以匹配计数,但如果您的元素少于4个,则这不起作用,如当前问题中所述

相关链接:
能力方法-
修剪多余部分方法-

关于默认容量的问题-

我们可以使用TrimOverse方法来减少容量以匹配计数,但如果您的元素少于4个,则此方法无效,如当前问题中所述

相关链接:
能力方法-
修剪多余部分方法-

关于默认容量的问题-

您不需要强制
筛选.Value
字符串
;仅强制
过滤器
就足够了-
(字符串)过滤器
(请参阅)。@ZevSpitz:感谢您指出这一点。您不需要强制
过滤器。值
字符串
;仅强制
过滤器
就足够了-
(字符串)过滤器
(请参阅)。@ZevSpitz:感谢您指出这一点。并且推测
foreach
将忽略
null
元素。@ZevSpitz实际上是
foreach
枚举,直到达到
大小。当然,您也可以将空元素添加到列表中,这不会被忽略。我的意思是,由于
容量
大小
而包含的
null
列表的内部属性
?@ZevSpitz是,但它与
计数
相同。“实际计数”只返回内部
\u size
,该值在添加项目时增大,在删除项目时减小。并且推测
foreach
将忽略
null
元素。@ZevSpitz实际
foreach
枚举,直到达到
size
为止。当然,您也可以将空元素添加到列表中,这不会被忽略。我的意思是,由于
容量
大小
而包含的
null
列表的内部属性
?@ZevSpitz是,但它与
计数
相同。实际上,count只返回内部
\u size
,当添加项目时,该值增加,当删除项目时,该值减少。
public class Country
{
    public String Name { get; set; }
    public String NumericCode { get; set; }
    public String FileName { get; set; }
}
    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();