1. 概述

  本章内容包括 .net平台中的集合、如何选择集合 以及 如何实现自定义集合。

2. 主要内容

  2.1 使用数组(Array)

int[] arrayOfInt = new int[]; 

for (int x = ; x < arrayOfInt.Length; x++)
{
    arrayOfInt[x] = x;
} foreach (int i in arrayOfInt) //实现了IEnumerable
{
    Console.Write(i); // Displays 0123456789
}

    .net中还支持多维数组和锯齿(jagged)数组

string[,] array2D = new string[, ] { { “one”, “two” }, { “three”, “four” },
                        { “five”, “six” } }; int[][] jaggedArray = 
   {
        new int[] {,,,,},
        new int[] {,,,},
        new int[] {,}
    };

  2.2 理解泛型和非泛型版本

    *使用值类型作为泛型参数的时候,要注意可能会发生的装箱情况。比如值类型未实现IEquatable<T>或IComparable<T>的时候。

  2.3 使用列表(List)

    List<T>的定义:

public class List<T> : IList<T>, ICollection<T>, IList, ICollection, 
IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable

    其中IList<T> 和 ICollection<T> 的定义如下:

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
        T this[int index] { get; set; }
        int IndexOf(T item);
void Insert(int index, T item);    
        void RemoveAt(int index);
}
public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
        int Count { get; }    
        bool IsReadOnly { get; }
        void Add(T item);    
        void Clear();    
        bool Contains(T item);    
        void CopyTo(T[] array, int arrayIndex);    
        bool Remove(T item);
}

    下面是使用List<T>操作数据项的示例:

List<string> listOfStrings =
    new List<string> { “A”, “B”, “C”, “D”, “E” }; for (int x = ; x < listOfStrings.Count; x++)
    Console.Write(listOfStrings[x]); // Displays: ABCDE listOfStrings.Remove(“A”); Console.WriteLine(listOfStrings[]); // Displays: B listOfStrings.Add(“F”); Console.WriteLine(listOfStrings.Count); // Displays: 5 bool hasC = listOfStrings.Contains(“C”); Console.WriteLine(hasC); // Displays: true

  2.4 使用字典(Dictionary)

    字典由键值对组成,可以根据键获取值。不允许重复的键。字典的定义:

public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>,
ICollection<KeyValuePair<TKey, TValue>>, IDictionary, ICollection,
IReadOnlyDictionary<TKey, TValue>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>,
IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable, ISerializable,
IDeserializationCallback

    字典的使用示例:

Person p1 = new Person { Id = , Name = “Name1” };
Person p2 = new Person { Id = , Name = “Name2” };
Person p3 = new Person { Id = , Name = “Name3” }; var dict = new Dictionary<int, Person>();
dict.Add(p1.Id, p1);
dict.Add(p2.Id, p2);
dict.Add(p3.Id, p3); foreach (KeyValuePair<int, Person> v in dict)
{
    Console.WriteLine(“{}: {}”, v.Key, v.Value.Name);
} dict[] = new Person { Id = , Name = “Name4” }; Person result;
if (!dict.TryGetValue(, out result))
{
    Console.WriteLine(“No person with a key of  can be found”);
}

  2.5 使用集(sets)

    sets是一个非重复的,无序集合。C#中set是系统保留关键字,可以使用HastSet<T>,它实现了ISet<T>。

public interface ISet<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
bool Add(T item);
void ExceptWith(IEnumerable<T> other);
void IntersectWith(IEnumerable<T> other);
bool IsProperSubsetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
void SymmetricExceptWith(IEnumerable<T> other);
void UnionWith(IEnumerable<T> other);
}

    使用HashSet<T>的示例:

public void UseHashSet()
{
    HashSet<int> oddSet = new HashSet<int>();
    HashSet<int> evenSet = new HashSet<int>();     for (int x = ; x <= ; x++)
    {
        if (x %  == )
            evenSet.Add(x);
        else
            oddSet.Add(x);
    }     DisplaySet(oddSet);
    DisplaySet(evenSet);     oddSet.UnionWith(evenSet);
    DisplaySet(oddSet);
} private void DisplaySet(HashSet<int> set)
{
    Console.Write(“{“);
    foreach (int i in set)
    {
        Console.Write(“ {}”, i);
    }
    Console.WriteLine(“ }”);
}

  2.6 使用队列(queue)和堆栈(stack)

    队列主要用于临时存储数据,遵循先进先出的原则。三个重要的方法是:Enqueue、Dequeue、Peek。

Queue<string> myQueue = new Queue<string>();
myQueue.Enqueue(“Hello”);
myQueue.Enqueue(“World”);
myQueue.Enqueue(“From”);
myQueue.Enqueue(“A”);
myQueue.Enqueue(“Queue”); foreach (string s in myQueue)
    Console.Write(s + “ “);
// Displays: Hello World From A Queue

    堆栈 遵循先进后出的原则。也具有跟队列类似的三个方法:Push、Pop、Peek。

Stack<string> myStack = new Stack<string>();
myStack.Push(“Hello”);
myStack.Push(“World”);
myStack.Push(“From”);
myStack.Push(“A”);
myStack.Push(“Queue”); foreach (string s in myStack)
    Console.Write(s + “ “);
// Displays: Queue A From World Hello

  2.7 选择合适的集合

    各个集合间最大的不同是 元素的访问方式:

    ① 列表和字典都支持元素的随机访问。字典提供了更快的元素读取速度,但是不能存储重复的数据项。

    ② 队列和堆栈提供了特定顺序的元素访问方式。元素取出后就自动从集合删除了。

    ③ 基于Set的集合,在元素比较方面有一些特性。但是不提供元素的随机访问。

  2.8 创建自定义集合

    .net提供的集合相关的接口包括: IEnumerable、IEnumerable<T>、IList<T>、ICollection<T>、IDictionary<TKey,TValue>、

    ICollection<TKey,TValue>、ISet<T>。

    也可以继承现有的集合对象来添加自定义的方法:

public class PeopleCollection : List<Person>
{
    public void RemoveByAge(int age)
    {
        for (int index = this.Count - ; index >= ; index--)
        {
            if (this[index].Age == age)
            {
                this.RemoveAt(index);
            }
        }
    }     public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        foreach (Person p in this)
        {
            sb.AppendFormat(“{} {} is {}”, p.FirstName, p.LastName, p.Age);
        }
        return sb.ToString();
    }
}

3. 总结

  ① .net提供了泛型和非泛型的集合版本,使用的时候,优先选择泛型版本。

  ② 数组(Array)是最基础的集合,是定长的。

  ③ 列表(List)是使用最多的集合,是变长的。

  ④ 字典(Dictionary)是存取键值对的集合。

  ⑤ HashSet保存唯一项并提供相应的操作。

  ⑥ 队列是先进先出的集合。

  ⑦ 堆栈是先进后出的集合。

  ⑧ 可以通过实现指定的接口或者继承现有的集合来自定义集合类型。

第二十二章 数据访问(In .net4.5) 之 集合的更多相关文章

  1. 第十九章 数据访问(In .net4.5) 之 处理数据

    1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...

  2. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  3. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  4. 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记

    第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...

  5. Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  6. 20190925 On Java8 第二十二章 枚举

    第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  8. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. UVA 10892 - LCM Cardinality

    Problem F LCM Cardinality Input: Standard Input Output: Standard Output Time Limit: 2 Seconds A pair ...

  2. jBox 弹出窗口中焦点设置问题

    jBox  是一个不错的组件库,可以用来比较简单地弹出窗口. 我希望在 jBox 弹出窗口之后,自动将焦点设置到子窗口的某个输入框中,可是发现并不容易. 在 jBox 2.3 中,提供了如下的增强. ...

  3. 剑指Offer:面试题4——替换空格(java实现)

    问题描述:请实现一个函数,把字符串中的每个空格替换成"%20". 例如: 输入:"We are happy." 输出:"We%20are%20happ ...

  4. (Loadrunner)Abnormal termination, caused by mdrv process termination.(转)

    Load generator跑了太多用户导致CPU和内存爆满,进程无法处理请求 确认自定义的代码是否释放内存 合理调整或增加思考时间 关闭extended log 尽量避免使用Load generat ...

  5. 【PL/SQL练习】显式游标

    cursor --------需要用户先定义,在select时,可以用于处理多行记录 1.declare  声明一个游标 2.open cursor (隐式游标自动open) 3.fetch curs ...

  6. iOS 7中使用UINavigationController进行pop崩溃

    最近在一个项目中遇到一种情况,push到一个界面,如果那个界面未请求到数据,则直接pop回去,然而使用 [self.navigationController popViewControllerAnim ...

  7. phpinfo中查不到memcache信息问题

    已经安装了php的memcache扩展,可是怎么都不能通过phpinfo查询到,实际使用时提示扩展未安装.为什么呢?百般寻求解决方法,才发现主要有以下两点原因: 1.使用的php和安装扩展的php不是 ...

  8. Java学习一

    Java程序的运行机制和JVM     JVM(java 虚拟机) Java Virtual Machine java语言比较特殊,由Java语言编写的程序需要经过编译步骤, JDK java SE ...

  9. MFC启动和关闭线程

    1. 启动线程: CWinThread* AfxBeginThread( 线程函数,this ); 2.通常导致线程终止的两种情况是:控制函数退出或不允许线程完成运行.如果字处理器使用后台打印线程,若 ...

  10. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...