2012-12-06 42 views
1

我的XML:的LINQ to 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

任何想法,爲什麼會是這樣嗎?

+1

你不必強迫'filter.Value'到' string';它足以單獨強制「過濾器」 - 「(字符串)過濾器」(請參閱​​[這裏](http://msdn.microsoft.com/en-us/library/bb387049.aspx))。 –

+0

@ZevSpitz:謝謝你指出。 – hs2d

回答

4

原因很簡單 - List<T>的默認容量等於4. Capacity獲取或設置內部數據結構可以保存的元素總數,而無需調整大小。內部數據結構是一個簡單的數組private Country[] _items,它最初的長度等於4.因此,第四個元素有一個保留位置,直到元素分配爲止。但不要擔心 - 如果您檢查,元素數量將爲3

這裏是一個圖像,其示出了兩個公共(三個項目)和內部數據結構(容量大小的陣列)

Internal structure of List

+0

大概'foreach'會忽略'null'元素。 –

+0

@ZevSpitz實際上'foreach'列舉,直到達到'size'。您也可以將null元素添加到列表中,這不會被忽略。 –

+0

當然。我的意思是'null'包含在'Capacity'中。 –