C# 集合数据处理的常用方法
集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。
集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。
所有集合都实现了IEnumerable接口,在这个接口中已经有了Where方法,使用扩展方法添加自己的MyWhere方法:
using System; using System.Collections.Generic; namespace 集合扩展方法 { class Program { static void Main(string[] args) { int[] nums = { 5, 5, 6, 9, 5, 2, 3, 6, 4, 12, 15, 4, 6, 18, 2, 3, 5, 6, 4, 8 };//整型数组 IEnumerable<int> r = nums.MyWhere(i => i > 8);//调用扩展方法,判断 i是否大于8 foreach (var item in r)//循环 { Console.WriteLine(item);//输出 } string[] strs = { "今天天气很好!", "吃过饭了吗?", "今天去哪里玩?", "明天去吃火锅!", "下个月去旅游。", "钱包里还有多少钱?", "今年多大了?" };//字符串数组 IEnumerable<string> str = strs.MyWhere(s => s.Contains("?"));//判断字符串是否包含"?" foreach (var item in str)//循环 { Console.WriteLine(item);//输出 } Console.ReadKey(); } } static class JiHe//静态类 { public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func)// 扩展方法,返回 IEnumerable 类型 { List<T> resultList = new List<T>();//声明泛型List foreach (var item in data)//循环 { if (func(item))//调用Func委托,判断 { resultList.Add(item);//添加元素到List列表 } } return resultList;//返回 } } }
生成结果:
集合常用扩展方法:
using System; using System.Collections.Generic; using System.Linq; namespace 常用 { class Program { static void Main(string[] args) { List<int> list = new List<int>();//列表 list.Add(5);//添加元素 list.Add(7);//添加元素 list.Add(3);//添加元素 list.Add(10);//添加元素 list.Add(25);//添加元素 list.Add(17);//添加元素 list.Add(11);//添加元素 int max = list.Max();//求最大值 int min = list.Min();//求最小值 int sum = list.Sum();//求总和 double avg = list.Average();//求平均值 Console.WriteLine("最大值: {0}\r\n最小值: {1}\r\n总和: {2}\r\n平均值: {3}\r\n",max,min,sum,avg);//输出 Console.ReadKey(); } } }
生成结果:
集合OrderBy扩展方法:
using System; using System.Collections.Generic; using System.Linq; namespace 集合OrderBy { class Program { static void Main(string[] args) { List<int> list = new List<int>();//列表 list.Add(5);//添加元素 list.Add(7);//添加元素 list.Add(3);//添加元素 list.Add(10);//添加元素 list.Add(25);//添加元素 list.Add(17);//添加元素 list.Add(11);//添加元素 IEnumerable<int> r = list.OrderBy(i => i);//降序排序 foreach (var item in r)//循环 { Console.WriteLine(item);//输出 } Console.ReadKey(); } } }
生成结果:
集合自带的Where扩展方法:(对数据按照lambda表达式进行过滤)
using System; using System.Collections.Generic; using System.Linq; namespace 集合Where { class Program { static void Main(string[] args) { List<int> list = new List<int>();//列表 list.Add(5);//添加元素 list.Add(7);//添加元素 list.Add(3);//添加元素 list.Add(10);//添加元素 list.Add(25);//添加元素 list.Add(17);//添加元素 list.Add(11);//添加元素 IEnumerable<int> r = list.Where(i => i > 5);//通过IEnumerable接口实现Where扩展方法,i => i > 5 是 lambda表达式 foreach (var item in r)//循环 { Console.WriteLine(item);//输出 } Console.ReadKey(); } } }
生成结果:
集合自带的Select扩展方法:(对集合的数据按照lambda表达式进行处理,生成一个新的集合。集合长度一样。)
using System; using System.Collections.Generic; using System.Linq; namespace 集合Select { class Program { static void Main(string[] args) { List<int> list = new List<int>();//列表 list.Add(5);//添加元素 list.Add(7);//添加元素 list.Add(3);//添加元素 list.Add(10);//添加元素 list.Add(25);//添加元素 list.Add(17);//添加元素 list.Add(11);//添加元素 IEnumerable<int> r = list.Select(i => i * 2);//将所有元素 * 2,保存到新表中,元素list表元素不变。 foreach (var item in r)//循环 { Console.WriteLine(item);//输出 } Console.ReadKey(); } } }
生成结果:
First、FirstOrDefault、Single、SingleOrDefault扩展方法:
using System; using System.Linq; namespace 集合扩展方法1 { class Program { static void Main(string[] args) { string[] strs1 = { };//没有元素的数组 string[] strs2 = { "A" };//一个元素的数组 string[] strs3 = { "A", "B" };//大于一个元素的数组 //string s1 = strs1.First();//抛异常,集合不能为null。 string s2 = strs2.First();//First 获取集合中的第一个元素,如果集合中一个元素都没有,则抛异常。 string s3 = strs3.First();//First 获取集合中的第一个元素,如果集合中一个元素都没有,则抛异常。 Console.WriteLine("s2 获取:" + s2);//输出 Console.WriteLine("s3 获取:" + s3);//输出 string s4 = strs1.FirstOrDefault();//FirstOrDefault 获取集合中的第一个元素,如果集合内没有元素,则返回集合类型的默认值。 string s5 = strs2.FirstOrDefault(); string s6 = strs3.FirstOrDefault(); Console.WriteLine("s4 获取:" + s4);//输出 Console.WriteLine("s5 获取:" + s5);//输出 Console.WriteLine("s6 获取:" + s6);//输出 //string s7 = strs1.Single();//抛异常 string s8 = strs2.Single();//获取集合中的唯一一个元素,如果集合中没有元素或者多余一个元素,则抛异常 //string s9 = strs3.Single();//抛异常 Console.WriteLine("s8 获取:" + s8);//输出 string s10 = strs1.SingleOrDefault();//获取集合中的唯一一个元素,如果集合中没有元素则返回null。如果集合内多余一个元素,则抛异常。 string s11 = strs2.SingleOrDefault();//获取第一个元素 //string s12 = strs3.SingleOrDefault();//抛异常 Console.WriteLine("s10 获取:" + s10);//输出 Console.WriteLine("s11 获取:" + s11);//输出 Console.ReadKey(); } } }
生成结果:
以上方法可以组合使用!
例如:
int r = list.Where(i => i > 5).Select(a=>a*2).OrderBy(o=>o).First();//获取大于5的数值,将数值 * 2,降序排列,获取第一个值。