• C# 集合类型学习


    如果你掌握了一门语言的数据结构 ,那么你离掌握这门语言 也不远了

    1.列表

    对于list,值得一提的是 Capacity 属性,使用默认的构造函数 ,让我们用代码来说明

       var intList = new List<int>();
                Console.WriteLine(intList.Capacity);
                //输出0
    
                intList.Add(0);
                Console.WriteLine(intList.Capacity);
                //输出4
    
                intList.AddRange(new List<int>(){1,2,3,4});
                Console.WriteLine(intList.Capacity);
                //输出8
    
                intList.AddRange(new List<int>() { 5, 6, 7, 8 });
                Console.WriteLine(intList.Capacity);
                //输出16
    
                Console.Read();

    说明:当往list中添加一个元素的时候,如果list.count > list.Capacity Capacity的值就会增加一倍,而程序有需要为这个list分配一个double的数值,你想想 ,如果你的一个程序是1025的大小的列表....这种让系统自动分配内存会使add操作特别的费时,因此如果你能预测你所有用列表的大小,可以在初始化的时候指定 Capacity 的值.

    2.队列

    特性:先进先出

    高级:消息队列  看到一个类似于消息队列的例子 ,让我在想是否可以在项目中利用 ,先模拟了这个例子,记录一下 保留灵感

       public class Preson
        {
            public string Name { get; set; }
    
            public string Age { get; set; }
    
            public string Sex { get; set; }
    
            public override string ToString()
            {
                return Name + " " + Age + " " + Sex;
            }
        }
       public class PresonManager
        {
           private  Queue<Preson> _presons = new Queue<Preson>();
    
           public void AddPreson(Preson preson)
           {
               lock (this)
               {
                   _presons.Enqueue(preson);
               }
           }
    
           public Preson GetPreson()
           {
               Preson preson = new Preson();
               lock (this)
               {
                   preson = _presons.Dequeue();
               }
               return preson;
           }
    
           public bool IsPresonAvailable
           {
               get { return _presons.Count > 0; }
           }
    
          
        }
    比较重要的一个类 使用异步去读取队列中的元素(消息) 如果有消息就处理,如果没有,就 while(true) 一直循环  囧 这样真的好吗   

    public class PresonProcess { private PresonProcess(PresonManager pm) { if(pm==null) throw new ArgumentNullException("pm"); _presonManager = pm; } public static void Start(PresonManager pm) { Task.Factory.StartNew(new PresonProcess(pm).Run); } private PresonManager _presonManager; public void Run() { while (true) { if (_presonManager.IsPresonAvailable) { Console.WriteLine("Process Preson {0}",_presonManager.GetPreson()); } Thread.Sleep(new Random().Next(20)); } } }

    class Program { static void Main(string[] args) { var pm = new PresonManager(); PresonProcess.Start(pm); for (int i = 0; i < 20; i++) { Console.WriteLine("Preson {0}",i); pm.AddPreson(new Preson() { Age = i.ToString(), Name = "Mo", Sex = "" }); Thread.Sleep(new Random().Next(20)); } Console.Read(); } }

    3.堆栈

    头进尾出

    4.链表

    5.字典

      有一个非常有意思的类,叫做lookup,用一个类型的本身的一个元素作为key

     static void Main()
        {
          var racers = new List<Racer>();
          racers.Add(new Racer(26, "Jacques", "Villeneuve", "Canada", 11));
          racers.Add(new Racer(18, "Alan", "Jones", "Australia", 12));
          racers.Add(new Racer(11, "Jackie", "Stewart", "United Kingdom", 27));
          racers.Add(new Racer(15, "James", "Hunt", "United Kingdom", 10));
          racers.Add(new Racer(5, "Jack", "Brabham", "Australia", 14));
    
          var lookupRacers = racers.ToLookup(r => r.Country);
    
          foreach (Racer r in lookupRacers["Australia"])
          {
            Console.WriteLine(r);
          }
    
        }

    6.集  包含不重复元素 HashSet SortedSet

    7 可观察集合 ObserveCollection<T> 

    8 线程安全的集合 以及管道...没看懂

  • 相关阅读:
    t
    溢出
    https://stackoverflow.com/questions/45591594/fetch-does-not-send-headers
    显示在用户屏幕上的缩略图
    cache buffer
    LZW
    t
    指针悬挂
    使用Linux服务器来通过网络安装和激活Windows 7 —— 一些基本原理
    在C++中如何动态分配一个二维数组
  • 原文地址:https://www.cnblogs.com/qingtianMo/p/5333172.html
Copyright © 2020-2023  润新知