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. T4 assembly

    In a T4 template the executing assembly is not yours but one from the T4 engine. To access types fro ...

  2. Hive表数据导出

    方式一: hadoop命令导出 hadoop fs -get hdfs://hadoop000:8020/data/page_views2 pv2  方式二:通过insert...directory导 ...

  3. Win2008远程多用户登陆的配置方法 另附详细设置: Windows server 2008 R2实现多用户远程连接

    Win2008远程多用户登陆的配置方法     在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法: 首先要启用远程桌面这一功能:右击“我的电脑”→ 属性 → ...

  4. Orchard官方文档翻译(八) 为站点增加博客

    原文地址:http://docs.orchardproject.net/Documentation/Adding-a-blog-to-your-site 想要查看文档目录请用力点击这里 最近想要学习了 ...

  5. 慕课网-安卓工程师初养成-4-6 Java条件语句之 switch

    来源:http://www.imooc.com/code/1358 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本 ...

  6. UIApplication介绍

    一.什么是UIApplication UIApplication对象是应用程序的象征. 每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它是一个单例对象. 一个i ...

  7. Duilib学习笔记《03》— 控件使用

    在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...

  8. js中字符串,数字之间转换的常用方法

    var number={ num:, num1:"2你好" }; //将数字转换为字符串 var str=number.num.toString();//十进制 );//二进制 ) ...

  9. 手机h5 页面 iPhone 下 手机号码 蓝色字体 黑色字体

    在手机端 苹果系统下 手机号码会变成蓝色的 ,如何不让手机号变成蓝色  黑色 或者其他颜色 , 苹果真是的 原因是识别成了电话号码,然后成为了链接.解决方法: 更改链接的颜色 a{ color: re ...

  10. leetcode 9

    判断一个数是否为回文数,不利用额外的空间. 思路:将数反转后进行比较. 注意:反转之后数越界的判断,若越界,则不是回文数:负数不是回文数: 代码如下: class Solution { public: ...