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; }
      }

只读集合(https://www.jb51.net/article/244084.htm)提供了集合的只读视图。在不使用只读视图访问集合的情况下,该集合仍可以修改。而永远不能改变不变的集合。

到此这篇关于C#集合之不变集合的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#集合之集(set)的用法

    包含不重复元素的集合称为“集(set)”..NET Framework包含两个集HashSet<T>和SortedSet<T>,它们都实现ISet<T>接口.HashSet<T>集包含不重复元素的无序列表,SortedSet<T>集包含不重复元素的有序列表.ISet<T>接口提供的方法可以创建合集,交集,或者给出一个是另一个集的超集或子集的信息. var companyTeams = new HashSet<string>

  • C#集合之可观察集合的用法

    如果需要集合中的元素何时删除或添加的信息,可以使用ObservableCollection<T>类.这个类是为WPF定义的,这样UI就可以得知集合的变化.这个类在程序集WindowsBase中定义,需要引用这个程序集.ObservableCollection<T>类派生自Collection<T>基类,该基类可用于创建自定义集合,并在内部使用List<T>类.重写基类的虚方法SetItem()和RemoveItem(),以触发CollectionChange

  • C#集合之链表的用法

    LinkedList<T>是一个双向链表,其元素会指向它前面和后面的元素.这样,通过移动到下一个元素可以正向遍历链表,通过移动到前一个元素可以反向遍历链表. 链表在存储元素时,不仅要存储元素的值,还必须存储每个元素的下一个元素和上一个元素的信息.这就是LinkedList<T>包含LinkedListNode<T>类型的元素的原因.使用LinkedListNode<T>,可以获得列表中的下一个和上一个元素.LinkedListNode<T>定义了

  • C#集合之栈的用法

    栈(Stack)和队列是非常类似的一个容器,只是栈是一个后进先出(LIFO)的容器.栈用Push()方法在栈中添加元素,用Pop()方法获取最近添加的一个元素: Stack<T>与Queue<T>类(https://www.jb51.net/article/244090.htm)类似,实现了ICollection和IEnumerable<T>接口.Stack<T>类的成员: 在foreach语句中,栈的枚举器不会删除元素,它只会逐个返回元素.使用Pop()方

  • C#集合之队列的用法

    队列是其元素按照先进先出(FIFO)的方式来处理的集合.队列使用System.Collections.Generic名称空间中的泛型类Queue<T>实现.在内部,Queue<T>类使用T类型的数组,这类似List<T>(https://www.jb51.net/article/244084.htm)类型.队列实现ICollection和IEnumerable<T>接口,但没有实现ICollection<T>接口,所以ICollection<

  • C#集合之有序列表的用法

    如果需要基于键对所需集合排序,就可以使用SortedList<TKey,TValue>类.这个类按照键给元素排序.这个集合中的值和键都可以使用任何类型.定义为键的自定义类型需要实现IComparer<T>接口,用于给列表中的元素排序.使用构造函数创建一个有序列表,在用Add方法添加: var books = new SortedList<string, string>(); books.Add("Professional WPF Programming&quo

  • C#集合之字典的用法

    字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素.字典也称为映射或散列表.字典的主要特性是能根据键快速查找值.也可以自由添加和删除元素,这有点像List<T>(https://www.jb51.net/article/244084.htm),但没有在内存中移动后续元素的性能开销.下图是一个简化表示,键会转换位一个散列.利用散列创建一个数字,它将索引和值关联起来.然后索引包含一个到值的链接.一个索引项可以关联多个值,索引可以存储为一个树型结构. .NET Framework提供了

  • C#集合之位数组的用法

    如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构.BitArray类位于System.Collection,BitVector32结构位于System.Collection.Specialized.这两种类型最重要的区别是,BitArray类可以重新设置大小,如果事先不知道需要的位数,就可以使用BitArray类.BitVector32结构是基于栈的,因此比较快.BitVector32结构仅包含32位,它们存储在一个整数中. 1.BitArray类 BitAr

  • C#集合之列表的用法

    目录 1.创建列表 2.添加元素 3.插入元素 4.访问元素 5.删除元素 6.搜索 7.排序 8.类型转换 9.只读集合 .NET Framework为动态列表List提供泛型类List<T>.这个类实现了IList,ICollection,IEnumerable,IList<T>,ICollection<T>,IEnumerable<T>接口. 1.创建列表 创建一个赛车手类,下面的例子会用到: public class Racer : ICompara

  • Java中Map集合中的Entry对象用法

    Entry: 键值对 对象. 在Map类设计是,提供了一个嵌套接口(static修饰的接口):Entry.Entry将键值对的对应关系封装成了对象,即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值. Entry为什么是静态的? Entry是Map接口中提供的一个静态内部嵌套接口,修饰为静态可以通过类名调用. Map集合遍历键值对的方式: Set<Map.Entry<K,V>> entrySet(); //返回此映射中包含的映射

  • C#集合之不变集合的用法

    如果对象可以改变其状态,就很难在多个同时运行的任务中使用.这些集合必须同步.如果对象不能改变器状态,就很容易在多个线程中使用.Microsoft提供了一个新的集合库:Microsoft Immutable Collection.顾名思义,它包含不变的集合类————创建后不能改变的集合类.该类在System.Collection.Immutable中定义. //使用静态的Create方法创建该数组,Create方法被重载,可以传递任意数量的元素 ImmutableArray<string> a1

  • 详解MongoDB中创建集合与删除集合的操作方法

    创建集合:createCollection() 方法 MongoDB db.createCollection(name, options) 是用来创建集合. 语法: 基本的 createCollection() 命令语法如下: db.createCollection(name, options) 在命令中, name 是要创建的集合的名称. Options 是一个文件,用于指定配置的集合 参数 类型 描述 Name String 要创建的集合名称 Options Document (可选)指定有

  • Java底层基于链表实现集合和映射--集合Set操作详解

    本文实例讲述了Java底层基于链表实现集合和映射--集合Set操作.分享给大家供大家参考,具体如下: 在Java底层基于二叉搜索树实现集合和映射中我们实现了底层基于二叉搜索树的集合,本节就底层如何基于链表实现进行学习,注意:此处的链表是之前自己封装的. 1.集合set相关功能 1.1 add()的不同 用于链表本身没有去重的效果,因此我们在做基于链表的集合时,需要对add()方法做一下特殊处理,如下增加一个判断即可. @Override public void add(E e) { if (!l

  • Java底层基于二叉搜索树实现集合和映射/集合Set功能详解

    本文实例讲述了Java底层基于二叉搜索树实现集合和映射功能.分享给大家供大家参考,具体如下: 前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构. 集合set的特性: 集合Set存储的元素是无序的.不可重复的.为了能达到这种特性就需要寻找可以作为支撑的底层数据结构. 这里选用之前自己实现的二叉搜索树,这是由于该二叉树是不能盛放重复元素的.因此我们可以使用二叉搜索

  • 一分钟了解Java中List集合与set集合的多种遍历方式

    List集合与set集合的多种遍历方式 方法有: 1. for循环遍历 2. foreach增强循环遍历 3. 迭代器遍历 4. lambda表达式遍历 一.List集合的遍历 1.创建一个集合,添加一些元素放在集合当中 public static void main(String[] args) { //int[] ins = new int[8];//int List<String> list = new ArrayList<String>();//List,ArrayList

  • java返回集合为null还是空集合及空集合的三种写法小结

    目录 返回集合为null还是空集合及空集合的三种写法 返回空List的方式 方式一:new ArrayList()   方式二:new ArrayList(0) 方式三:Collections.emptyList()(推荐) 返回集合为null还是空集合及空集合的三种写法 个人认为在自己写接口时,需要返回集合时返回一个空集合,比如mybatis查询如果返回一个集合,结果为空时也会返回一个空集合而不是null. 那么这样有什么好处呢?最大的好处就是调用方不用在判断是否为null,可以直接用,因为不

  • Python利用redis-py实现集合与有序集合的常用指令操作

    目录 集合数据类型的添加操作 集合数据类型的删除元素操作 获取集合数据类型的所有元素 有序集合数据类型的添加操作 有序集合数据类型的分数值增加操作 有序集合数据类型的排序指令(降序) 集合与有序集合相关指令演示小案例 集合数据类型的添加操作 在 “redis-py” 中也是通过 “sadd” 这条指令去创建添加集合数据类型的,这一点与在 “redis” 中是一致的.示例如下: con.sadd("JobNumber", 1001, 1002, 1003) # 这里的 con 就是创建的

  • javascript ES6中set集合、map集合使用方法详解与源码实例

    set与map理解 ES6中新增,set集合和map集合就是一种数据的存储结构(在ES6之前数据存储结构只有array,object),不同的场景使用不同的集合去存储数据 set集合 Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用. set集合语法: //创建一个set集合,传参为一个可迭代的对象 const s1 = new Set(iterable); API 名称 类型 简介 Set.add() 原型方法 添加数据 Set.has() 原型方法 判断是否存在一个数据 S

  • C#中Dictionary泛型集合7种常见的用法

    要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)  Dictionary的描述 1.从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成 2.任何键都必须是唯一的 3.键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值 4.Key和Value可以是任何类型(string,int,custom class 等) Dictionary常用用法:以

随机推荐