第二十二章 数据访问(In .net4.5) 之 集合
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) 之 集合的更多相关文章
- 第十九章 数据访问(In .net4.5) 之 处理数据
1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...
- 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
- 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记
第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...
- Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 20190925 On Java8 第二十二章 枚举
第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第二十二章:try-with-resources语句详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
随机推荐
- gcc编译, gdb调试, makefile写法
//test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...
- 使用MonkeyTest对Android客户端进行压力测试 自动化代码
1.monkey命令简介 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...
- 如何用C代码生成二维码
如何用C代码生成二维码 当下因微信和支付宝等手机应用广泛使用,而基于二维码/一维条码的移动支付,也借助手机移动端席卷全国,使得越来越多的人知道有"二维码"这么一种东西. 对于普通用 ...
- 2013款Mac Pro“神秘”主机详解
2013款Mac Pro"神秘"主机详解 自2013年12月下旬新款Mac Pro在美国发布以来,经过一个月的等待终于在国内已到货,笔者亲自测试了这个号称"神秘" ...
- .Net字符串驻留池
在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量 ...
- C# 后台请求web服务方法
/// <summary> /// 传输方法 /// </summary> /// <param name ...
- 【MVC】关于Action返回结果类型的事儿(下)
代码
- WP8_区分滑动和点击(在图片列表中)
在windows phone中,对于一个页面中 有图片列表的,滑动的时候,很容易被误认为是点击了图片,而打开图片详细信息等,原意是滑动列表,由此对图片添加2个事件,来控制其点击行为(滑动的时候,基本不 ...
- std::cout彩色输出
Mac OS效果 Windows 效果 想写这个东西其实是因为最近要写个命令行的工具,但是有个问题是什么呢?就是传统的那个黑漆漆的窗口看起来很蛋疼.并且完全看不到重点,于是就想起 来这么一个东西.相对 ...
- Vim中的正则表达式[转]
来自:http://blog.csdn.net/endall/archive/2007/08/29/1764554.aspx Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操 ...