2010-08-12 87 views
0

我有一個數組LINQ,列表和添加項目質疑

package.Resources 

以下如果我使用

package.Resources.ToList().Add(resouce); 

package.Resources實際上並不包含新項目。

我不得不使用

var packageList = package.Resources.ToList(); 
packageList.Add(resource); 
package.Resources = packageList.ToArray(); 

這是爲什麼?

+1

將一個新項目添加到**數組**時,您的預期結果是什麼?在某個(哪個?)索引處使用新項目的數組,取代之前可能存在的任何項目?一個新的,更大的陣列? (從你上次的代碼看起來是這樣) – AakashM 2010-08-12 15:33:15

回答

5

ToList()根據原始數組創建一個全新的不同列表。

LINQ是隻讀的;語言集成查詢 - 它只查詢數據,不修改數據。所有的LINQ方法都會產生一個投影 - 例如,它們將原始序列投影到一個新的序列中,所以你總是在反對這個方法。

+0

/拍拍他的前額。咄。 – CaffGeek 2010-08-12 15:32:15

+0

謝謝。如此明顯當你這樣說 – CaffGeek 2010-08-12 15:32:52

+0

@Chad yep,歡呼! – 2010-08-12 15:34:44

1

財產Resources返回IEnumerableEnumerable.ToList()從此IEnumerable建立一個新的列表。然後,您將一個項目添加到新列表中,而不是Resources正在訪問的原始集合,因此您的更新沒有任何影響。

3

當你調用package.Resources.ToList().Add(resouce);,它的功能也可以這樣做:

var resourcesAsList = new List<WhateverTypeResourcesContains>(); 
foreach(var item in package.Resources) 
{ 
    resourcesAsList.Add(item); 
} 
var resourcesAsList.Add(resouce); 

這意味着是package.Resources沒有被修改過,你已經創建了一個List<T>包含每個項目時package.Resources遏制。

2

Exanding在什麼Rex said,當你調用.ToList()數組對象,你說的話是,「讓我一個全新的List對象,它是從原始數組一個不同的參考,但是從我原來的數組作爲使用對象我列表中的對象。「

由於數組的大小是固定的,如果沒有將現有數組複製到具有增加容量的新數組(甚至VB世界中的ReDim Preserve將數組複製到scense後面),真的沒有辦法將Add()複製到它。因此,如果在實例化時不知道數組中項目的總數,應該問自己爲什麼使用數組。當你知道物品的數量,或者當你從現有的ListIEnumerable實例化陣列時,陣列可以是一個體面的輕量級方法來保存一組對象。但是,如果直到運行時才知道容量,並且源不是IEnumerable,則List可能是更好的選擇,因爲它隨着項目的添加而構建爲容量的增長。

我在班級使用下面的集合類型的屬性:

  • IEnumerable
    • 我用IEnumerable當我將要遍歷一個已經存在的集合,我不會被添加到它。例如,如果我查詢目錄中的文件,並且希望將這些文件作爲類中的屬性,則可以使用public IEnumerable<FileInfo> DirectoryFiles {get; set;}
    • IEnumerable允許我通過現有的一組數據進行查詢,但我不一定關心它是什麼集合,只要它實現IEnumerable即可。
  • List<T>
    • 我使用的是List<T>當我需要的是能長或動態收縮的集合,即集合不存在arealdy別的地方,我可能需要從它添加或刪除項目。
    • 一個很好的例子是,如果您允許用戶在應用程序的用戶界面中添加項目並將其刪除到列表框中。由於列表框中的項目可能會增大或縮小,因此List<T>是有意義的。
  • ObservableCollection<T>
    • 我使用這種類型的集合中的Silverlight/WPF的世界,因爲它有內置的事件時,在收集變化的項目數。當您希望UI元素在列表更改時自動更新時,這對於數據綁定方案尤其方便。

除非我消耗已經有數組對象我幾乎從來不使用數組明確。當然,他們是一個不錯的輕量級商店,但我通常可以通過上面列出的3種類型獲得。

+0

它實際上是類中的一個List,但該對象是從webmethod返回的,它以數組的形式返回。我將一個項目添加到該對象,然後將其傳遞給另一個webmethod以保存它。是的,理想情況下,這不會通過web服務,但我沒有選擇。 – CaffGeek 2010-08-12 16:07:09

+0

@查德我知道這是怎麼回事。我通常最終使用很多相同的reasone列表,即當我被迫時。 – 2010-08-12 16:40:42