第二十二章 数据访问(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异 ...
随机推荐
- Flexigrid例子二: 原位编辑器
有时候,我们想要编辑flexigrid里的数据.一个原位编辑器是需要的,现在不需要再弹出一个对话框了.这里我会展示如何做到这点. 我使用了jquery-in-place-editor库.请参考官方站点 ...
- PreparedStatement和Statment
使用Statment安全性差,存在SQL注入隐患 public static void main(String[] args) { Connection conn=null; Statement st ...
- leetcode 349:两个数组的交集I
Problem: Given two arrays, write a function to compute their intersection. 中文:已知两个数组,写一个函数来计算它们的交集 E ...
- 哪项技术可以用在WEB开发中实现会话跟踪实现?
HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web 服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息.即使那些支持持续性 HTTP 连接的服务器,尽管多个客户请求连 ...
- Indian Scientists Design Device to Collect Solar Energy 印度科学家设计太阳能收集设备
Indian scientists have designed a new device they hope will solve one of the biggest problems with ...
- js数据结构与算法存储结构
数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间 ...
- 3.5 The Lexical-Analyzer Generator Lex
3.5 The Lexical-Analyzer Generator Lex In this section, we introduce a tool called Lex, or in a more ...
- error: could not find library containing RSA_new
error: could not find library containing RSA_new yum -y install openssl-devel apt-get install libssl ...
- python 多行匹配
content = ''' abcdefg hijklmn opq rst uvw xyz ''' r = re.compile('\S+cde\S+|\S+klm\S+|^xyz$', re.MUL ...
- centreon 画图x轴乱码
rrdtool默认不指定locale,使用本地locale.乱码我估记是中文字体,由于操作系统最小化安装,本地没有中文字体,导致乱码. 1 安装中文字体 yum -y install wqy-zenh ...