第二十二章 数据访问(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异 ...
随机推荐
- Android性能优化之:ViewStub
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...
- No.001 Two Sum
Two Sum Total Accepted: 262258 Total Submissions: 1048169 Difficulty: Easy Given an array of integer ...
- plsql快捷开发
最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他同事使用PLSQL 编程效率明显高于自己,观察了好久,才发现他使用PLSQL 已经很长时间了而且,他自己也在其中添加了好多快捷方式, 1.登 ...
- 【Linux】基于Linux的buffer和cache学习
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘.其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读 ...
- ASP.NET的SEO: 服务器控件背后——SEO友好的Html和JavaScript
本系列目录 假设你需要从一个页面转向其他页面,下面有很多种方式,你是如何选择的呢?你能清晰的说明理由么? <%--链接的表现形式--%> <asp:Hy ...
- Tomcat 7优化前及优化后的性能对比
Tomcat 7在我们日常开发.测试.生产环境都会使用到,但对于大部分开发人员来说,对其性能还是没有多大了解.本文就对它做一次性能测试,对比优化前后的性能区别. 一.运行环境 CPU: Intel(R ...
- oracle查询使用频率和磁盘消耗需要缓存大小
SELECT * FROM (SELECT Sql_Text, Sql_Id, Cpu_Time FROM V$sql ORDER BY Cpu_Time DESC) ORDER BY Rownum ...
- [原]sdut2605 A^X mod P 山东省第四届ACM省赛(打表,快速幂模思想,哈希)
本文出自:http://blog.csdn.net/svitter 题意: f(x) = K, x = 1 f(x) = (a*f(x-1) + b)%m , x > 1 求出( A^(f(1) ...
- Mysql授权GRANT ALL PRIVILEGES
1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- linux下securetty文件
“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录.登录程序(通常是“/bin/login”)需要读取“/etc/securetty”文件.它的格式是:列出来的tt ...