【c#基础】特殊集合2-可观察的集合 不变集合

一:可观察的集合

如果需要知道集合中的元素何时删除或添加的信息,就可以使用ObservableCollection<T>类。

.Net Core中要使用,需要引用Nuget包System.ObjectModel。这个类的名称空间是System.Collections.ObjectModel.

ObservableCollection<T>类派生自Collection<T>基类。该基类用于创建自定义集合。并在内部使用List<T>类。重写基类中的虚方法SetItem()和RemoveItem(),以触发CollectionChanged事件。这个类的用户就可以使用INotifyCollectionChanged接口注册这个事件。

TODO:INotify 貌似很多地方有很多这个 后面在查相关信息

 

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5 
 6             var data = new ObservableCollection<string>();
 7             data.CollectionChanged += Data_CollectionChanged;
 8             data.Add("One");
 9             data.Add("Two");
10             data.Insert(1, "Three");
11             data.Remove("One");
12             Console.WriteLine("Hello World!");
13         }
14 
15         public static void Data_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
16         {
17             Console.WriteLine($"action:{e.Action.ToString()}");
18             if (e.OldItems != null)
19             {
20                 Console.WriteLine($"starting index for old items:{e.OldStartingIndex}");
21                 Console.WriteLine("old items:");
22                 foreach (var item in e.OldItems)
23                 {
24                     Console.WriteLine(item);
25                 }
26             }
27 
28             if (e.NewItems != null)
29             {
30                 Console.WriteLine($"starting index for new items:{e.NewStartingIndex}");
31                 Console.WriteLine("new items:");
32                 foreach (var item in e.NewItems)
33                 {
34                     Console.WriteLine(item);
35                 }
36             }
37 
38             Console.WriteLine();
39         }

不变的集合:

如果对象可以改变其状态,就很难在多个同时运行的任务中使用。这些集合必须同步。

如果对象不能改变其状态,就很容易在多个线程中使用。不能改变的对象称为不变的对象。

不能改变的集合称为不变的集合。

为了使用不可变的集合。可以添加Nuget包System.Collections.Immutable。这个库命名空间

System.Collections.Immutable中的集合类。

只读集合利用可变集合的接口。使用这个接口,不能改变集合。如果有人仍然引用可变的集合。

它就仍然可以改变。对于不可变的集合,没有人可以改变这个集合。

在使用不变数组的每个阶段,都没有复制完整的集合。相反,不变类型使用了共享状态,仅在需要时复制集合。

但是,先填充集合,再将它b变成不变的数组会更高效。

 

 1   public class Account
 2     {
 3         public string  Name { get; set; }
 4         public decimal Balance { get; set; }
 5 
 6         public Account(string name,decimal balance)
 7         {
 8             Name = name;
 9             Balance = balance;
10         }
11     }

 

 1   var accounts = new List<Account>()
 2             {
 3                 new Account("Scrooge McDuck",667377678765m),
 4                 new Account("Donald Duck",-200m),
 5                 new Account("Ludwig von Drake",2000m),
 6             };
 7             //使用ToImmutableList扩展方法创建一个不变的集合。
 8             ImmutableList<Account> immutableList = accounts.ToImmutableList();
         //也可以像其他集合那样枚举,只是不能改变。
9 foreach (var account in immutableList) 10 { 11 Console.WriteLine($"{account.Name} {account.Balance}"); 12 }

不实用foreach语句迭代不变的列表,也可以使用ImmutableList<T>定义的foreach()方法,这个方法需要一个Action<T>委托作为参数。因此可以分配lambda表达式。

1  accounts.ForEach(a => Console.WriteLine($"{a.Name} {a.Balance}"));

为了处理这些集合,可以使用Contains、FindAll、FindLast、IndexOf()等方法。

如果需要更改不变集合的内容,集合提供了Add、AddRange、Remove、RemoveAt、RemoveRange、Replace以及Sort方法。这些方法非常不同于正常的集合类。因为用于调用方法的不可变集合永远不会改变,但是这些方法放回一个新的不可变集合。

 

【c#基础】特殊集合2-可观察的集合 不变集合

上一篇:C#读取Xml中出现”&”等特殊符号


下一篇:差分信号经运放后转为单端输出供单片机采集原理图