C#集合之不變的集合


  如果對象可以改變其狀態,就很難在多個同時運行的任務中使用。這些集合必須同步。如果對象不能改變器狀態,就很容易在多個線程中使用。
  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)提供了集合的只讀視圖。在不使用只讀視圖訪問集合的情況下,該集合仍可以修改。而永遠不能改變不變的集合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM