如果對象可以改變其狀態,就很難在多個同時運行的任務中使用。這些集合必須同步。如果對象不能改變器狀態,就很容易在多個線程中使用。 Microsoft提供了一個新的集合庫:Microsoft Immutable Collection。顧名思義,它包含不變的集合類————創建後不能改變的集合類。該類在Sy ...
如果對象可以改變其狀態,就很難在多個同時運行的任務中使用。這些集合必須同步。如果對象不能改變器狀態,就很容易在多個線程中使用。
Microsoft提供了一個新的集合庫:Microsoft Immutable Collection。顧名思義,它包含不變的集合類————創建後不能改變的集合類。該類在System.Collection.Immutable中定義。
//使用靜態的Create方法創建該數組,Create方法被重載,可以傳遞任意數量的元素 ImmutableArray<string> a1 = ImmutableArray.Create<string>(); //Add 方法不會改變不變集合本身,而是返回一個新的不變集合 ImmutableArray<string> a2 = a1.Add("Williams"); //可以一次調用多個Add方法 ImmutableArray<string> a3 = a2.Add("Ferrari").Add("Mercedes").Add("Red Bull Racing"); foreach (var item in a3) { Console.WriteLine(item); }
在使用不變數組的每個階段,都沒有複製完整的集合。相反,不變類型使用了共用狀態,僅在需要時複製集合。
但是,先填充集合,再將它變成不變的數組會更高效(使用ToImmutableList方法)。需要進行一些處理時,可以再變為可變的集合(使用ToBuilder方法)。使用不變集合的提供的構建器ImmutableList<Account>.Builder。
List<Account> accounts = new List<Account>() { new Account { Name = "Scrooge McDuck", Amount = 667377678765m }, new Account { Name = "Donald Duck", Amount = -200m }, new Account { Name = "Ludwig von Drake", Amount = 20000m }}; ImmutableList<Account> immutableAccounts = accounts.ToImmutableList(); ImmutableList<Account>.Builder builder = immutableAccounts.ToBuilder(); for (int i = 0; i < builder.Count; i++) { Account a = builder[i]; if (a.Amount > 0) { builder.Remove(a); } } ImmutableList<Account> overdrawnAccounts = builder.ToImmutable(); foreach (var item in overdrawnAccounts) { Console.WriteLine("{0} {1}", item.Name, item.Amount); } public class Account { public string Name { get; set; } public decimal Amount { get; set; } }
只讀集合(http://www.cnblogs.com/afei-24/p/6824791.html)提供了集合的只讀視圖。在不使用只讀視圖訪問集合的情況下,該集合仍可以修改。而永遠不能改變不變的集合。