Collection集合的应用
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo1
{
internal class Program
{
static void Main(string[] args)
{
//Collection,Array, ArrayList, List, Queue, Stack
// 1。回顾数组
//Array数组中定义数据,数组项,数组索引。
//数组中可以存储同类型的数据,也可以存储不同类型数据。
// 实例化并初始化
int[] ints = new int[] { 1, 2, 3 };
// 实例化
int[] ints2 = new int[3];
// 通过索引给某项赋值
ints2[0] = 10;
ints2[1] = 20;
ints2[2] = 30;
// 简写
int[] ints3 = { 1, 2, 3 }; // 语法糖
// object[] 可以存储不同类型的数据。
object[] objs = { "abc", 100, false };
//Array中静态的方法。实例数组中的方法。
//数组本身就是集合。
// 2。集合
// <T>未知类型
Collection<int> collection = new Collection<int>();
collection.Add(1); // Add向集合添加元素(项),规律:方法变灰,VS不建议用。
var collection2 = new Collection<string>();
collection2.Add("abc");
List<string> list = new List<string>() { "abc", "def" };
Collection<string> collection3 = new Collection<string>(list);
Console.WriteLine("集合的长度(项的数量):" + collection3.Count); // 集合中数据项数量,类似于数组中Length
// 3。集合Collection的API
Collection<int> c1 = new Collection<int>() { 1, 2, 3 }; // 创建集合并初始化
//c1.Remove(2); // 移除,注意参数是项的值,而非项的索引
//c1.Clear();//清空
// Add()会影响集合,但Append()不会影响集合,产生一个IEnumerable可迭代的数据,注意:IEnumerable和ICollection的关系,ICollection接口继承IEnumerable接口。
IEnumerable<int> en = c1.Append(4);
// 循环,集合只所以能循环是因为Collection实现了IEnumerable,
foreach (int i in c1)
{
Console.WriteLine("集合中的项:" + i);
}
foreach (var item in en)
{
Console.WriteLine("迭代中的项:" + item);
}
// Sum()扩展方法,数字类型的集合中才有此方法。
Console.WriteLine("集合中所有的项的和:" + c1.Sum());
Collection<string> c2 = new Collection<string>() { "hello", "world" };
//Console.WriteLine("集合中所有的项的和:" + c2.Sum()); // 报错
// All()判断集合中所有的项,满足Func函数的业务逻辑,如果满足则返回true,否则返回false。
// Func===Function函数,相当于方法,有两写法:普通方法,lambda表示式(匿名方法)
// ()=>{} 格式其他语言中(如js),称为箭头函数,在C#称为lambda表示式。()是方法的参数列表,=>是固定格式,{}方法体,放置开发者编写的业务逻辑。
// Func<int,bool> <T,K>是泛型语法, T==int其实是集合中的项的数据类型,K==bool其实是lambda表示式的返回结果(方法返回值)。
bool result = c1.All((c) => { return c < 5; });
Console.WriteLine("集合c1中每一项都小于5:" + result);
// any用法和all相同,只要有一个项满足Func委托的业务逻辑,就返回true,否则返回false.
bool result2 = c1.Any((c) => { return c == 1; });
Console.WriteLine("集合c1中至少有一项=1:" + result2);
// 规律:Is,Have,Can,Contains一般返回bool。
Console.WriteLine("3是否在c1集合中:" + c1.Contains(3));
Console.WriteLine("5是否在c1集合中:" + c1.Contains(5));
//c1.RemoveAt(0); // RemoveAt根据集合中项的索引来删除某个项,而Remove是根据集合中项的值来删除某项。
// Add()从集合末尾添加,影响原集合, Append()从集合末尾添加,不影响原集合, Insert()从集合的任何位置插入项,影响原集合。
/*c1.Insert(1, 4); // 在索引为1的位置插入一个值4,集合中原来索引为1的值被后移。
foreach (int i in c1)
{
Console.WriteLine("集合中的项:" + i);
}*/
// Func<int,int,int> 其中int是集合c1中每个项的类型,总共有3个项
// Aggregate累加器
// 第一次循环:a是集合中第一项,b是集合中的第二项
// 第二次循环:a是第一次循环的结果,b是是集合中的第三项
// ........
int result3 = c1.Aggregate((a, b) => { return a + b; });
Console.WriteLine(result3);
string result4 = c2.Aggregate((a, b) => { return a + " " + b; });
Console.WriteLine(result4);
//为了循环,转换IEnumerable性能为快些。
IEnumerable<int> query = c1.AsEnumerable(); // 1,2,3
// from q in query where q<=2 select q语法就是Linq语法,后面会讲。
/*IEnumerable<int> result5 = from q in query where q <= 2 select q;
IEnumerable<int> result6 = from c in c1 where c <= 2 select c;
foreach (var item in result6)
{
Console.WriteLine(item);
}*/
// 顺序循环
foreach (var item in c1)
{
Console.WriteLine(item);
}
Collection<int> c3 = new Collection<int>();
for (int i = 1; i <= 100; i++)
{
c3.Add(i);
}
// Parallel对象在后面讲Task时会学。
// Action()和Func()讲事件,委托时会学。
// 并行循环
c3.AsParallel().ForAll(new Action<int>((c) => {
Console.WriteLine(c);
})) ;
// 并行循环
/*var result5 = Parallel.For(1, 101, (i) =>
{
Console.WriteLine(i);
});
Console.WriteLine(result5);*/
Console.ReadKey();
}