转:Linq基础学习

2023-11-02

本文为转摘博客园大牛文章之一。

原文地址:http://www.cnblogs.com/foundation/archive/2009/01/05/1369371.html

目录

1    LINQ查询结果集    1

2    System.Array 数组    1

2.1    基于System.Array定义数组    1

2.2    基于类型定义数组    1

2.3    数组元素的清空    1

2.4    System.Array类静态成员    1

2.5    不用循环填充数组    1

2.6    数组类实例成员    2

3    System.Collections 集合    2

3.1    ArrayList    2

3.1.1    实例成员    2

3.1.2    静态成员    2

3.2    List<T>    3

3.3    Hashtable    6

3.4    SortedList    6

3.5    SortedList<TKey,TValue>    7

3.6    Queue<T>    8

3.7    Stack<T>    8

3.8    LinkedList<T>    8

3.9    HashSet<T>    9

4    System.Linq    10

4.1    System.Linq.Enumerable    10

4.2    System.Linq.Queryable    10

4.3    System.Linq.Lookup <TKey,TElement>    10

4.4    System.Linq.Expressions.Expression    10

5    接口    10

5.1    IEnumerable 、IEnumerator    10

5.1.1    正常使用    10

5.1.2    C#的 yield    12

5.2    IEnumerable <T>    12

5.3    IEnumerator <T>    12

5.4    ICollection    12

5.5    ICollection <T>    13

5.6    IList    13

5.7    IList <T>    13

5.8    IEqualityComparer    13

5.9    IEqualityComparer <T>    13

5.10    IDictionary    13

5.11    IDictionary <TKey,TValue>    13

5.12    IDictionaryEnumerator    13

5.13    IComparer    13

5.13.1    接口方法说明 int Compare(object x, object y)    13

5.13.2    ArrayList.Sort (IComparer) 方法    13

5.14    IComparer <T>    14

5.14.1    接口方法override int Compare(T x, T y)说明    14

5.14.2    List.Sort (IComparer) 方法    14

5.15    System.Linq.IGrouping<T>    14

5.16    System.Linq.ILookup<TKey,TElement>    14

5.17    System.Linq.IOrderedEnumerable<T>    14

5.18    System.Linq.IOrderedQueryable    14

5.19    System.Linq.IOrderedQueryable<T>    15

5.20    System.Linq.IQueryable    15

5.21    System.Linq.IQueryable<T>    15

5.22    System.Linq.IQueryProvider    15

6    集合扩展方法    15

6.1    集合扩展方法的实现:一个Where的例子    15

6.2    延迟类    15

6.2.1    Select 选择    16

6.2.2    SelectMany 选择    16

6.2.3    Where 条件    16

6.2.4    OrderBy 排序升    17

6.2.5    OrderByDescending 排序降    17

6.2.6    GroupBy 分组    17

6.2.7    Join 联合查询    18

6.2.8    GroupJoin    18

6.2.9    Take 获取集合的前n个元素    19

6.2.10    Skip 跳过集合的前n个元素    19

6.2.11    Distinct 过滤集合中的相同项    19

6.2.12    Union 连接不同集合,自动过滤相同项    19

6.2.13    Concat 连接不同集合,不会自动过滤相同项    19

6.2.14    Intersect 获取不同集合的相同项(交集)    20

6.2.15    Except 从某集合中删除其与另一个集合中相同的项    20

6.2.16    Reverse 反转集合    20

6.2.17    TakeWhile 条件第一次不成立就跳出循环    20

6.2.18    SkipWhile 条件第一次不成立就失效,将后面的数据全取    20

6.2.19    Cast 将集合转换为强类型集合    21

6.2.20    OfType 过滤集合中的指定类型    21

6.3    不延迟(浅复本)    21

6.3.1    Single 集合中符合条件的唯一元素,浅复本    21

6.3.2    SingleOrDefault 集合中符合条件的唯一元素(没有则返回类型默认值),浅复本    21

6.3.3    First 集合的第一个元素,浅复本    21

6.3.4    FirstOrDefault 集合中的第一个元素(没有则返回类型默认值),浅复本    22

6.3.5    Last 集合中的最后一个元素,浅复本    22

6.3.6    LastOrDefault 集合中的最后一个元素(没有则返回类型默认值),浅复本    22

6.3.7    ElementAt 集合中指定索引的元素,浅复本    22

6.3.8    ElementAtOrDefault 集合中指定索引的元素(没有则返回类型默认值),浅复本    22

6.3.9    Contains 判断集合中是否包含有某一元素    22

6.3.10    Any 判断集合中是否有元素满足某一条件    22

6.3.11    All 判断集合中是否所有元素都满足某一条件    23

6.3.12    SequenceEqual 判断两个集合内容是否相同    23

6.3.13    Count 、LongCount集合中的元素个数    23

6.3.14    Average 、Sum集合平均值求和    23

6.3.15    Max、Min 集合最大值,最小值    24

6.3.16    Aggregate 根据输入的表达式获取一个聚合值    24

6.3.17    DefaultIfEmpty 查询结果为空则返回默认值,浅复本    24

6.3.18    ToArray 将集合转换为数组,浅复本    24

6.3.19    ToList 将集合转换为List<T>集合,浅复本    25

6.3.20    ToDictionary 将集合转换为<K, V>集合,浅复本    25

  

7    Lambda表达式    25

7.1    例1(比效)    25

7.2    例2(多参)    27

7.3    例3(list.Where)    27

7.4    Lambda表达式中Lifting    28

8    QuerySyntax 查询语法    29

8.1    from in select    30

8.2    orderby 排序    30

8.3    group by into 分组    31

8.4    join in on equals 联合查询    33

8.5    into 汇总    33

9    DataSource 数据绑定    34

LINQ查询结果集

Linq

System.Collections.Generic.IEnumerable<T>

Linq to DataSet

System.Data.EnumerableRowCollection<DataRow>

Linq to SQL

System.Linq.IQueryable<T>

Linq to XML

System.Collections.Generic.IEnumerable<T>

System.Array 数组

所有数组都继承于System.Array,数组可以用System.Array建立

数组可以是一维也可以是多维数组。"维数"对应于用来识别每个数组元素的下标个数。维数可以多达 32 维。 数组的每一维都有一个非零的长度。在数组的每一维中,数组元素按下标 0 到该维最高下标值连续排列.数组没有固定大小。数组在创建以后仍可以改变大小。

数组是对象,因此每种数组类型都是一个单独的引用类型。这意味着:

1.数组变量中含有指向数据的指针,这些数据包含元素、秩和长度信息。

2.在将一个数组变量赋值给另一个数组变量时,只有指针进行了复制。

3.两个数组变量只有在具有相同的维数和元素数据类型时,才能看成是同一数据类型的数组变量。

基于System.Array定义数组

System.Array x=System.Array.CreateInstance(typeof(string),7);

x.SetValue("4",0);

x.SetValue("8",1);

x.SetValue("7",2);

x.SetValue("1",3);

x.SetValue("3",4);

x.SetValue("2",5);

x.SetValue("5",6);

System.Console.WriteLine(x.GetValue(5));

使用这种方式声明,只能用SetValue与GetValue方法进行赋值与取值,

不能使用x[i]的方式,也不会有x[i].方法() 出现

基于类型定义数组

类型[,] 数组名 = new 类型[该维个数, 该维个数];

类型[,] 数组名;

数组名 = new 类型[个数,个数];

类型[,] 数组名;

数组名 = new 类型[,] {{{值1, 值2, 值3},{值1, 值2, 值3}};

类型[,] 数组名 = {{值1, 值2, 值3},{值1, 值2, 值3}};

类型[] 数组名 ={{值1, 值2, 值3};

数组元素的清空

数组名 = null;

这时不只数组中的元素数据被清空了,而且数组的元素也被清空了.

如果要再使用该数组,需要用重新指定维中的元素个数.

数组的维结构不能被清除.

System.Array类静态成员

清空指定数组位置中元素的值

Array.Clear(数组名, 从第几个开始, 清除几个)

把[源数组名]中的数据复制到[目标数组名]

Array.Copy(源数组名, 目标数组名, 要复制的个数)

按升序排列.只能对一维数组使用

Array.Sort(数组名)

对数组中的元素的顺序返转.

Array.Reverse(数组名)

从前向后在数组中查找指定的值.反回在数组中的位置值,如果没找到返回-1,第一个位置是0.

i= Array.IndexOf (数组名,要找的内容,开始位置)

从后向前在数组中查找指定的值.反回在数组中的位置值,如果没找到返回-1,第一个位置是0.

i = Array.LastIndexOf (数组名,要找的内容,开始位置)

不用循环填充数组

string[] v = new string[50];

v[0] = "wxwinter";

System.Collections.ArrayList.Repeat(v[0], v.Length).CopyTo(v);

泛型方法见集合的实例泛型方法

数组类实例成员

属性

Rank

返回数组的维数

属性

Length

返回数组中元素的个数.

方法

GetLength(维数)

返回指定维数中元素的个数.第一维是0

扩展方法见集合扩展方法

System.Collections 集合

ArrayList

System.Collections

一个数组型集合,使用的是随顺存储

实例成员

Capacity属性

获取或设置 ArrayList 可包含的元素数.当实际元素超过Capacity属性时,Capacity属性会在原来的数值上翻倍

Count属性

集合中元素的个数

int = Add(object)

将对象添加到集合尾部

AddRange(Array/List)

将 ICollection 的元素添加到 ArrayList 的末尾

object = Clone()

创建 ArrayList 的浅表副本

ArrayList =GetRange (index, count)

源 ArrayList 中元素的子集.

可以看成一个视图,两个集合数据是同步的

Insert(i,object)

将对象插入到集合的指定位置

InsertRange (index,Array/List)

将 ICollection 的元素插入到 ArrayList 的指定索引处

Remove(object)

从集合中移除指定对象

RemoveAt(index)

从集合中移除指定位置处的对象

RemoveRange (index,count)

从 ArrayList 中移除一定范围的元素

SetRange (index,Array/List)

将参数中的集合覆盖到调用该方法的集合的指定位置

Reverse()

返转集合中的对象

Sort()

对集合排序

对象集合见 System.IComparable接口

Sort (IComparer) 方法见 System.Collections.IComparer 接口

Clear()

清除集合中所有元素

向后查找

Integer=集合名.IndexOf (要找的内容变量,开始找的位置)

从前向后在数组中查找指定的值.反回在数组中的位置值,如果没找到返回-1,第一个位置是0.

向前查找

Integer =集合名. LastIndexOf(要找的内容变量,开始位置)

从后向前在数组中查找.反回在数组中的位置值,如果没找到返回-1

访问集合中的成员

集合[index]

静态成员

ArrayList ls2 = ArrayList.FixedSize(ls1)

ls2的元素允许修改,但不允许添加或移除。

两个集合数据是同步的

ArrayList ls2 = ArrayList. ReadOnly(ls1)

ls2的元素只读。

两个集合数据是同步的

List<T>

System.Collections.Generic

System.Collections.Generic.List<System.Windows.Forms.TextBox> jh = new List<TextBox>();

jh.Add(new TextBox());

jh.Add(new TextBox());

jh.Add(new TextBox());

int i = 100;

foreach (System.Windows.Forms.TextBox tp in jh)

{

i = i + 100;

tp.Text =i.ToString();

tp.Left = i;

this.Controls.Add(tp);

}

class a

{

public a(string v)

{ s = v;}

public string s;

}

//使用

System.Collections.Generic.List<a> jh = new List<a>();

jh.Add(new a("123"));

jh.Add(new a("456"));

jh.Add(new a("789"));

foreach (a tp in jh)

{

System.Console.WriteLine(tp.s);

}

除ArrayList方法外

ConvertAll

public List<TOutput> ConvertAll<TOutput> (Converter<T,TOutput> converter)

创建复本

调用委托

System.Converter< TInput,TOutput>

public delegate TOutput Converter<TInput, TOutput>(TInput input);

将对象从一种类型转换为另一种类型的方法

  1. 将当前 List 中的元素转换为另一种类型,并返回包含转换后的元素的列表

标准委托

public static void Main()

{

List<string> ls = new List<string>() { "1", "2", "3" };

//System.Converter<string, int> cw=new Converter<string,int>(stringToint);

//List<int> li = ls.ConvertAll<int>(cw);

List<int> li= ls.ConvertAll<int>(stringToint);

}

public static int stringToint(string s)

{

return int.Parse(s);

}

匿名方法

List<string> ls = new List<string>() { "1", "2", "3" };

List<int> li = ls.ConvertAll<int>(delegate(string s) { return int.Parse(s); });

Lambda表达式

List<string> ls = new List<string>() { "1", "2", "3" };

List<int> li = ls.ConvertAll<int>(i=>int.Parse(i));

集合扩展方法

List<string> ls = new List<string>() { "1", "2", "3" };

// System.Collections.Generic.IEnumerable<int> li = ls.Select(i => int.Parse(i)); ;

var li = ls.Select(i=>int.Parse(i));

  1. 将当前 List 中的元素值批量修改

static void Main(string[] args)

{

List<string> ls = new List<string>() { "1", "2", "3" };

List<string> li = ls.ConvertAll<string >(stringAdd);

}

public static string stringAdd(string s)

{

return s+"wxd";

}

ForEach

public void ForEach (    Action<T> action)

对 List 的每个元素执行指定操作

调用委托

System.Action <T>

public delegate void Action<T> (T obj)

对传递给它的对象执行某个操作的方法的委托

标准委托

static void Main(string[] args)

{

List<string> ls = new List<string>{"wxd","lzm"};

// System.Action<string> w = new System.Action<string>(wxdPrint);

// ls.ForEach(w);

ls.ForEach(wxdPrint);

}

static void wxdPrint(string s)

{

Console.WriteLine(s);

}

匿名方法

List<string> ls = new List<string>{"wxd","lzm"};

ls.ForEach(delegate(string name){ Console.WriteLine(name); });

Lambda表达式

List<string> ls = new List<string> { "wxd", "lzm" };

ls.ForEach(v=> Console.WriteLine(v));

集合扩展方法

 

Find、FindLast、FindIndex、FindLastIndex、Exists、TrueForAll

public T Find (Predicate<T> match)

检索与条件匹配的所有元素,并返回整个 List 中的第一个匹配元素,其中包含与指定谓词所定义的条件相匹配的所有元素;否则为一个空 List

创建复本

FindLast 返回索引值 public T FindLast (    Predicate<T> match)

FindIndex 返回索引值 public int FindIndex (    Predicate<T> match)

FindLastIndex 返回逻辑型 public int FindLastIndex (    Predicate<T> match)

Exists 返回逻辑型 public bool Exists (    Predicate<T> match)

TrueForAll 返回逻辑型,确定是否 List 中的每个元素都与指定的谓词所定义的条件相匹配 public bool TrueForAll (    Predicate<T> match)

调用委托

System.Predicate<T>

public delegate bool Predicate<T>(T obj);

定义一组条件并确定指定对象是否符合这些条件的方法

标准委托

public static void Main()

{

List<int> ls = new List<int>() { 1, 2, 3 };

//System.Predicate<int> cw = new Predicate<int>(wxdFind);

// int a = ls.Find(cw);

int a = ls.Find(wxdFind);

}

public static bool wxdFind(int v)

{

bool b = (v >= 2);// 查找条件

return b;

}

匿名方法

List<int> ls = new List<int>() { 1, 2, 3 };

int a = ls.Find(delegate(int v) { bool b = (v <= 2); return b; });

Lambda表达式

List<int> ls = new List<int>() { 1, 2, 3 };

int a = ls.Find(v => v >= 2);

   

FindAll

public List<T> FindAll (Predicate<T> match)

检索与条件匹配的所有元素,如果找到,则为一个 List,其中包含与指定谓词所定义的条件相匹配的所有元素;否则为一个空 List

创建复本

调用委托

System.Predicate<T>

public delegate bool Predicate<T>(T obj);

定义一组条件并确定指定对象是否符合这些条件的方法

标准委托

public static void Main()

{

List<int> ls = new List<int>() { 1, 2, 3 };

// System.Predicate<int> cw = new Predicate<int>(WxdFind);

//List<int> li = ls.FindAll(cw);

List<int> li = ls.FindAll(WxdFind);

}

public static bool WxdFind(int v)

{

bool b = (v <= 2);// 查找条件

return b;

}

匿名方法

List<int> ls = new List<int>() { 1, 2, 3 };

List<int> li = ls.FindAll(delegate(int v) { bool b = (v <= 2);return b; });

Lambda表达式

List<int> ls = new List<int>() { 1, 2, 3 };

List<int> li = ls.FindAll(v => v <= 2);

集合扩展方法

//以视图形式,不创建复本

List<int> ls = new List<int>() { 1, 2, 3 ,4,5};

//System.Collections.Generic.IEnumerable<int> li = ls.Where(i => i < 3);

var li = ls.Where(i => i < 3);

RemoveAll

public int RemoveAll (Predicate<T> match)

移除与指定条件相匹配的所有元素。

调用委托

System.Predicate<T>

public delegate bool Predicate<T>(T obj);

定义一组条件并确定指定对象是否符合这些条件的方法

标准委托

static void Main(string[] args)

{

List<int> ls = new List<int>() { 1,2, 2, 3,4,5 };

//System.Predicate<int> cw = new Predicate<int>(WxdRem);

//int n = ls.RemoveAll(cw);

int n = ls.RemoveAll(WxdRem); //n为移除的个数

}

public static bool WxdRem(int v)

{

bool b = (v <= 2);// 条件

return b;

}

匿名方法

List<int> ls = new List<int>() { 1,2, 2, 3,4,5 };

int n = ls.RemoveAll(delegate(int v) { bool b = (v <= 2);return b; });

Lambda表达式

List<int> ls = new List<int>() { 1, 2, 3 };

ls.RemoveAll(v => v<=2 );

   

Sort

public void Sort (    Comparison<T> comparison)

对 List 或它的一部分中的元素进行排序

Sort ()方法见 System.IComparable接口、System.IComparable<T>接口

Sort (IComparer) 方法见 System.Collections.IComparer 接口、System.Collections.Generic.IComparer<T> 接口

调用委托

System.Comparison<T>

public delegate int Comparison<T> (T x,T y)

表示比较同一类型的两个对象的方法

x 小于 y 返回小于0的负数

x 等于 y 返回0

x 大于 y 返回大于0的正数

标准委托

static void Main(string[] args)

{

List<int> ls = new List<int>{1,3,2,4,5,0,8,1};

// System.Comparison<int> w = new Comparison<int>(wxdSort);

// ls.Sort(w);

ls.Sort(wxdSort);

}

static int wxdSort(int x,int y)

{

int v = x - y;

return v;

//return -v; //升序

}

匿名方法

List<int> ls = new List<int>{1,3,2,4,5,0,8,1};

ls.Sort(delegate(int x, int y) { return x - y; });

Lambda表达式

List<int> ls = new List<int> { 1, 3, 2, 4, 5, 0, 8, 1 };

ls.Sort((x, y) => y - x);

集合扩展方法

//以视图形式,不创建复本

//不改变原集合的顺序

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

//System.Collections.Generic.IEnumerable<int> li = ls.OrderBy(i => i);

var li = ls.OrderBy(i => i);

Hashtable

System.Collections

System.Collections.DictionaryEntry 结构 字典键/值对

散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

哈希表使用的是链式存储

哈希表使用键值对的方式来存储

哈希表中,键名不能重复

添加键对

实例.Add(键,值);

查找值

bool = 实例.ContainsValue(值)

查找键

bool = 实例.ContainsKey(键)

移除键对

实例.Remove(键)

清空集合

实例..Clear()

通过键访问值

x[键]

得到所有键集合

foreach(object t1 in x.Keys)

{System.Console.WriteLine(t1);}

得到所有值集合

foreach(object t2 in x.Values)

{System.Console.WriteLine(t2);}

得到所有键值对集合

foreach(object zd in x)

{ System.Collections.DictionaryEntry obj =(DictionaryEntry)zd;

System.Console.WriteLine(obj.Key);

System.Console.WriteLine(obj.Value);

}

SortedList

System.Collections

SortedList将ArrayList与Hashtable的功能集成

集合容量

实例.Capacity 属性

查找键

bool = 实例.ContainsKey(键)

查找值

bool = 实例.ContainsValue(值)

得到索引处值

object =实例.GetByIndex(index)

设置索引处值

实例.SetByIndex(3,值)

通过键访问值

实例[键]

移除键对

实例.Remove(键)

移除索引处键对

实例.RemoveAt(index)

得到所有值集合

 

得到所有键值对集合

 

得到所有键值对集合

 

SortedList<TKey,TValue>

System.Collections.Generic

//System.IComparable

//定义通用的比较方法,由值类型或类实现以创建类型特定的比较方法。

class a : System.IComparable

{

public a(string va,int le)

{

s = va;

l = le;

}

public string s;

public int l;

//实现System.IComparable.CompareTo

public int CompareTo(object obj)

{

if (object.Equals(this, obj))

{

return 0;

}

else

{

return 1;

}

}

}

//使用

System.Collections.Generic.SortedList<a, System.Windows.Forms.TextBox> jh=new SortedList<a,TextBox>();

a k1 = new a("123",0);

a k2 = new a("456",100);

a k3 =new a("789",200);

jh.Add(k1, new TextBox());

jh.Add(k2, new TextBox());

jh.Add(k3, new TextBox());

//值操作

foreach (TextBox tp in jh.Values)

{

this.Controls.Add(tp);

}

//键操作

foreach (a tp in jh.Keys)

{

tp.s = "ok";

}

//键值对操作

foreach (System.Collections.Generic.KeyValuePair<a, TextBox> tp in jh)

{

tp.Value.Text = tp.Key.s;

tp.Value.Left = tp.Key.l;

}

//通过键操作值

jh[k2].Text = "hello";

Queue<T>

System.Collections.Generic

class a

{

public a(string v)

{

s = v;

}

public string s;

}

//使用

System.Collections.Generic.Queue<a> jh = new Queue<a>();

//入队

jh.Enqueue(new a("a"));

jh.Enqueue(new a("b"));

jh.Enqueue(new a("c"));

//出队:每执行一次出一个

if (0 != jh.Count)

{

a obj = jh.Dequeue();

System.Console.WriteLine(obj.s);

}

Stack<T>

System.Collections.Generic

class a

{

public a(string v)

{

s = v;

}

public string s;

}

//使用

System.Collections.Generic.Stack<a> jh = new Stack<a>();

//入栈

jh.Push(new a("a"));

jh.Push(new a("b"));

jh.Push(new a("c"));

//出栈:每执行一次出一个

if (0 != jh.Count)

{

a obj = jh.Pop();

System.Console.WriteLine(obj.s);

}

LinkedList<T>

System.Collections.Generic

class a

{

public a(string v)

{s = v;}

public string s;

}

//使用

System.Collections.Generic.LinkedList<a> lb = new LinkedList<a>();

System.Collections.Generic.LinkedListNode<a> p;

void 添加结点()

{

p = new LinkedListNode<a>(new a("1"));

lb.AddFirst(p);

lb.AddAfter(lb.First, new a("2"));

lb.AddBefore(lb.First, new a("3"));

lb.AddLast(new a("4"));

lb.AddFirst(new a("5"));

}

void 读取头尾结点()

{

string fs = lb.First.Value.s;

string ls = lb.Last.Value.s;

System.Console.WriteLine(fs +ls);

}

void 下一节点(object sender, EventArgs e)

{

p = p.Next;

if (p == null)

{

System.Console.WriteLine("到达边界");

}

else

{

System.Console.WriteLine(p.Value.s);

}

}

void 上一结点()

{

p = p.Previous;

if (p == null)

{

System.Console.WriteLine("到达边界");

}

else

{

System.Console.WriteLine(p.Value.s);

}

}

HashSet<T>

System.Collections.Generic

提供高性能的集运算。集是一组不重复出现且无特定顺序的元素

System.Collections.Generic.HashSet<int> h = new HashSet<int>();

//

h.Add(1);

h.Add(1); //不报错

h.Add(1);//不报错

h.Add(2);

h.Add(2);//不报错

h.Add(3);

//只显示

//1

//2

//3

foreach (var v in h)

{

System.Console.WriteLine(v);

}

System.Linq

System.Linq.Enumerable

System.Linq.Queryable

System.Linq.Lookup <TKey,TElement>

System.Linq.Expressions.Expression

public delegate TR lzm<T, TR>(T v1);

class Program

{

static void Main(string[] args)

{

System.Linq.Expressions.Expression<lzm<int, bool>> ep;

ep = le => le > 123;

}

}

接口

IEnumerable 、IEnumerator

System.Collections

010509_0605_Linq1.png010509_0605_Linq2.png

正常使用

定义:

public class 集合 : System.Collections.CollectionBase, System.Collections.IEnumerable

{

//属性访问器

成员 this[int index]

{

get{ return (成员)List[index] ; }

}

//添加成员

public int Add(成员 v)

{ return List.Add(v);}

//实现GetEnumerator接口

public new System.Collections.IEnumerator GetEnumerator()

{

迭代器 d = new 迭代器(this);

return d;

}

//--------以下为迭代器类-------------

//迭代器子类

public class 迭代器 : System.Collections.IEnumerator

{

int index = -1; //索引用

集合 jh;

public 迭代器(集合 v) //构造函数

{ jh = v; }

public void Reset() //重新初始化索引

{index = -1;}

public object Current //返回当前索引所指的对象

{

get{return jh.List[index];}

}

public bool MoveNext() //将索引指针向下移动一位

{

if (index < jh.List.Count-1)

{

index = index + 1;

return true;

}

return false;

}

}

//--------以下为成员类-------------

//迭代器中的数据成员

public class 成员

{ public string a;}

}

使用

集合.成员 s1 = new 集合.成员();

集合.成员 s2 = new 集合.成员();

s1.a = "wxd";

s2.a = "lzm";

集合 j = new 集合();

j.Add(s1);

j.Add(s2);

//第一种方法:显示使用

System.Collections.IEnumerator ee = j.GetEnumerator();

while (ee.MoveNext())

{

集合.成员 temp = ( 集合.成员)ee.Current;

System.Console.WriteLine(temp.a );

}

//第二种方法:隐式使用

foreach (集合.成员 bb in j)

{

System.Console.WriteLine(bb.a);

}

C#的 yield

当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable 接口的 Current、MoveNext 和 Dispose 方法

省去了写System.Collections.IEnumerator的代码

yield return expression1;

yield return expression2;

yield return expression3;

yield break; //将终止迭代,后面的迭代将不输出

yield return expression4;

创建

public class wxd : System.Collections.IEnumerable

{

string[] v = { "a", "b", "c", "d", "e", "f", "g" };

public System.Collections.IEnumerator GetEnumerator()

{

for (int i = 0; i < v.Length; i++)

{

yield return v[i];

}

yield return "wxd";

yield return "lzm";

}

}

使用

wxd x = new wxd();

//第一种方法:显示使用

System.Collections.IEnumerator ee = x.GetEnumerator();

while (ee.MoveNext())

{

string temp = (string)ee.Current;

System.Console.WriteLine(temp);

}

//第二种方法:隐式使用

foreach (string v in x)

{

System.Console.WriteLine(v);

}

结果

a

b

c

d

e

f

g

wxd

lzm

IEnumerable <T>

System.Collections.Generic

公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代。

IEnumerator <T>

System.Collections.Generic

支持在泛型集合上进行简单迭代。

ICollection

System.Collections

ICollection 接口是 System.Collections 命名空间中类的基接口。

ICollection 接口扩展 IEnumerable;IDictionary 和 IList 则是扩展 ICollection 的更为专用的接口。IDictionary 实现是键/值对的集合,如 Hashtable 类。IList 实现是值的集合,其成员可通过索引访问,如 ArrayList 类。

某些集合(如 Queue 类和 Stack 类)限制对其元素的访问,它们直接实现 ICollection 接口。

如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。

ICollection <T>

System.Collections.Generic

定义操作泛型集合的方法。

IList

System.Collections

IList 是 ICollection 接口的子代,并且是所有非泛型列表的基接口。IList 实现有三种类别:只读、固定大小和可变大小。无法修改只读 IList。固定大小的 IList 不允许添加或移除元素,但允许修改现有元素。可变大小的 IList 允许添加、移除和修改元素。

IList <T>

System.Collections.Generic

表示可按照索引单独访问的一组对象。

IEqualityComparer

System.Collections

对象的相等比较

IEqualityComparer <T>

System.Collections.Generic

定义方法以支持对象的相等比较。

IDictionary

System.Collections

键/值对基接口

IDictionary <TKey,TValue>

System.Collections.Generic

表示键/值对的泛型集合。

IDictionaryEnumerator

System.Collections

枚举字典的元素

IComparer

System.Collections

比较两个对象的方法

接口方法说明 int Compare(object x, object y)

int Compare(object x, object y)

方法的返回值

小于零 : x小于 y

零 : x等于y

大于零 : x大于 y

ArrayList.Sort (IComparer) 方法

class Program

{

static void Main(string[] args)

{

ArrayList ls = new ArrayList() { new wxd { value = 4 }, new wxd { value = 2 }, new wxd { value = 1 }, new wxd { value = 3 } };

ls.Sort(new wxd());

}

}

class wxd : System.Collections.IComparer

{

public int value;

public int Compare(object x, object y)

{

int v = ((wxd)x).value - ((wxd)y).value;

return v;

}

}

IComparer <T>

System.Collections.Generic

定义类型为比较两个对象而实现的方法。

接口方法override int Compare(T x, T y)说明

override int Compare(T x, T y)

方法的返回值

小于零 : x小于 y

零 : x等于y

大于零 : x大于 y

List.Sort (IComparer) 方法

class Program

{

static void Main(string[] args)

{

List<wxd> ls = new List<wxd> { new wxd { value = 4 }, new wxd { value = 2 }, new wxd { value = 1 }, new wxd { value = 3 } };

ls.Sort(new wxd());

}

}

class wxd : System.Collections.Generic.Comparer<wxd>

{

public int value;

public override int Compare(wxd x, wxd y)

{

int v = x.value - y.value;

return v;

}

}

System.Linq.IGrouping<T>

System.Linq.ILookup<TKey,TElement>

System.Linq.IOrderedEnumerable<T>

System.Linq.IOrderedQueryable

System.Linq.IOrderedQueryable<T>

System.Linq.IQueryable

System.Linq.IQueryable<T>

System.Linq.IQueryProvider

集合扩展方法

集合扩展方法的实现:一个Where的例子

public class a

{

public int ID { get; set; }

public string Name { get; set; }

public static void Main()

{

List<a> list = new List<a> { new a { ID = 1, Name = "wxd" }, new a { ID = 2, Name = "lzm" }, new a { ID = 3, Name = "wxwinter" } };

var l1 = list.WxdWhere(le => le.Name == "lzm");

// 上面的(Lambda表达式)等同于下面的(匿名方法)

IEnumerable<a> l2 = list.WxdWhere(delegate(a le) { return le.Name == "lzm"; });

//与调用系统Where一样

var l3 = list.Where(le => le.Name == "lzm");

}

}

public static class e

{

// 相关委托

public delegate TResult Func<T, TResult>(T arg);

//相关Where扩展方法

//Func<TSource, bool>:接受一个类型为TSource的参数

//Func<TSource, bool>:某个需要满足的条件,返回bool值

public static IEnumerable<TSource> WxdWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

{

foreach (TSource item in source)

{

if (predicate(item))

{

yield return item;

}

}

}

}

延迟类

1.须引用System.Core

2.对所有的集合者适用

3.最好用var对象存值

4.可以连用

var li = ls.OrderBy(i => i).Take(5);

表示排序后的前5个

5.使用System.Func委托

System.Func<TResult>

System.Func<T,TResult>

System.Func<T1,T2,TResult>

System.Func<T1,T2,T3,TResult>

System.Func<T1,T2,T3,T4,TResult>

6.只是视图,不创建复本

Select 选择

与ConvertAll 不一样,该方法以视图形式反回集合,不创建复本

Lambda表达式

List<string> ls = new List<string>() { "1", "2", "3" };

// System.Collections.Generic.IEnumerable<int> li = ls.Select(i => int.Parse(i)); ;

var li = ls.Select(i=>int.Parse(i));

标准委托

static void Main(string[] args)

{

List<string> ls = new List<string>() { "1", "2", "3" };

var li = ls.Select<string,string>(stringAdd);

}

public static string stringAdd(string s)

{

return s+"wxd";

}

匿名方法

List<string> ls = new List<string>() { "1", "2", "3" };

var li = ls.Select<string, int>(delegate(string s) { return int.Parse(s); });

Linq同类功能

List<string> ls = new List<string>() { "1", "2", "3" };

var li = from temp in ls select temp;

SelectMany 选择

Lambda表达式

List<string> ls = new List<string>() { "wxd/1", "lzm/2", "wxwinter/3" };

var li = ls.SelectMany(p => p.Split('/'));

foreach (var s in li)

{

Console.WriteLine(s);

}

010509_0605_Linq3.png

对应Select效果

var ll = ls.Select(p => p.Split('/'));

foreach (var s in ll)

{

foreach (var ss in s)

{

Console.WriteLine(ss);

}

}

Where 条件

与FindAll不一样,该方法以视图形式反回集合,不创建复本

List<int> ls = new List<int>() { 1, 2, 3, 4, 5 };

var li = ls.Where(i => i < 3); //li中此时只有1,2

ls[0] = 333; //1已改为333,li中此时只有2

Lambda表达式

//以视图形式,不创建复本

List<int> ls = new List<int>() { 1, 2, 3 ,4,5};

//System.Collections.Generic.IEnumerable<int> li = ls.Where(i => i < 3);

var li = ls.Where(i => i < 3);

标准委托

static void Main(string[] args)

{

List<int> ls = new List<int>() { 1, 2, 3, 4, 5 };

// System.Func<int, bool> ww = new Func<int, bool>(w);

// var li = ls.Where(ww);

var li = ls.Where(w);

}

public static bool w(int v)

{

return v<3;

}

匿名方法

List<int> ls = new List<int>() { 1, 2, 3, 4, 5 };

var li = ls.Where(delegate(int v){return v<3;});

Linq同类功能

List<int> ls = new List<int>() { 1, 2, 3, 4, 5 };

var li = from temp in ls where temp< 3 select temp;

OrderBy 排序升

与Sort不一样,以视图形式,不创建复本,不改变原集合的顺序

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = ls.OrderBy(i => i);

//----

ls[1] = 6666;

ls.Add(-5);

//---li中的顺序已重新排列

Lambda表达式

//以视图形式,不创建复本

//不改变原集合的顺序

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

//System.Collections.Generic.IEnumerable<int> li = ls.OrderBy(i => i);

var li = ls.OrderBy(i => i);

标准委托

static void Main(string[] args)

{

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = ls.OrderBy<int,int >(w );

}

public static int w(int i)

{

return -i; //降序

}

匿名方法

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

//var li = ls.OrderBy<int, int>(delegate(int i) { return -i; });

var li = ls.OrderBy(delegate(int i) { return -i; })

Linq同类功能

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = from temp in ls orderby temp select temp;

OrderByDescending 排序降

匿名方法

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = ls.OrderByDescending(delegate(int i) { return i; });

Lambda表达式

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = ls.OrderByDescending(i => i);

OrderBy模拟

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = ls.OrderBy(delegate(int i) { return -i; });

Linq同类功能

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = from temp in ls orderby temp descending select temp;

GroupBy 分组

该方法分组结果集合

System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TElement>>

010509_0605_Linq4.png

Lambda表达式

string[] wxd = { "Java", "C#", "C++", "Delphi", "VB.net", "VC.net", "C++ Builder", "Kylix", "Perl", "Python" };

var query = wxd.GroupBy(p => p.Length);

foreach (var item in query)

{

Console.WriteLine("长度 {0}", item.Key);

foreach (var val in item)

{

Console.WriteLine(val);

}

}

Linq同类功能

string[] wxd = { "Java", "C#", "C++", "Delphi", "VB.net", "VC.net", "C++ Builder", "Kylix", "Perl", "Python" };

var query = from item in wxd

group item by item.Length into lengthGroups

select lengthGroups;

Join 联合查询

Lambda表达式

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 3 } };

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

//返回一个新的匿名类的集合

var li=ls1.Join(ls2,temp1=>temp1.Name,temp2=>temp2.ID,(temp1,temp2)=>new { temp1.Name, temp1.Value, temp2.ID, temp2.bak });

foreach (var s in li)

{

Console.WriteLine("{0}-{1}-{2}-{3}", s.Name, s.ID, s.Value, s.bak);

}

}

}

public class T1

{

public string Name;

public int Value;

}

public class T2

{

public string ID;

public string bak;

}

010509_0605_Linq5.png

Linq同类功能

//返回一个新的匿名类的集合

var li = from temp1 in ls1 join temp2 in ls2 on temp1.Name equals temp2.ID select new { temp1.Name, temp1.Value, temp2.ID, temp2.bak };

GroupJoin

Lambda表达式

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 3 } };

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

//返回一个新的匿名类的集合

var li = ls1.GroupJoin(ls2, temp1 => temp1.Name, temp2 => temp2.ID, (temp1, temp2) => new { temp1.Name, temp1.Value, 个数 = temp2.Count() });

foreach (var s in li)

{

Console.WriteLine("Name :{0},共有:{1}",s.Name,s.个数.ToString());

}

}

}

public class T1

{

public string Name;

public int Value;

}

public class T2

{

public string ID;

public string bak;

}

010509_0605_Linq6.png

Linq同类功能

//返回一个新的匿名类的集合

var li = from temp1 in ls1

join temp2 in ls2 on temp1.Name equals temp2.ID

into newtab

select new { temp1.Name, temp1.Value, 个数 = newtab.Count() };

Take 获取集合的前n个元素

//以视图形式,不创建复本

List<int> ls = new List<int>() { 1, 3, 2, 4, 5, 0, 8, 1 };

var li = ls.Take(5); //li[1, 3, 2, 4, 5]

ls.Insert(0, 999); //li[999,1, 3, 2, 4]

Skip 跳过集合的前n个元素

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,50 };

var li = ls.Skip(5);

010509_0605_Linq7.png

Distinct 过滤集合中的相同项

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1 };

var li = ls.Distinct();

010509_0605_Linq8.png

Union 连接不同集合,自动过滤相同项

List<int> ls1 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1 };

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,100,200,100,300 };

var li = ls1.Union(ls2);

010509_0605_Linq9.png

Concat 连接不同集合,不会自动过滤相同项

List<int> ls1 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1 };

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,100,200,100,300 };

var li = ls1.Concat(ls2);

010509_0605_Linq10.png

Intersect 获取不同集合的相同项(交集)

List<int> ls1 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,50 };

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,100,200,100,300 };

var li = ls1.Intersect(ls2);

010509_0605_Linq11.png

Except 从某集合中删除其与另一个集合中相同的项

List<int> ls1 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,50 };

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,100,200,100,300 };

var li = ls1.Except(ls2);

010509_0605_Linq12.png

Reverse 反转集合

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,50 };

ls.Reverse();

TakeWhile 条件第一次不成立就跳出循环

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1,50 };

var li =ls.TakeWhile(p=>p<4);

010509_0605_Linq13.png

SkipWhile 条件第一次不成立就失效,将后面的数据全取

List<int> ls = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8,9 ,1,2,3};

var li =ls.SkipWhile(p=>p<=3);

010509_0605_Linq14.png

Cast 将集合转换为强类型集合

ArrayList ls1 = new ArrayList {"a","b","1" };

// ArrayList ls1 = new ArrayList { "a", "b", 1 }; //下面的转换会报错

// List<string > ls2 = (List<string >)ls1; //编译会报错

// List<string> ls3 = (List<string>)ls1.Cast<string>(); //运行会报错

var ls4 = ls1.Cast<string >();

List<string> ls5 = ls1.Cast<string>().ToList<string>();

OfType 过滤集合中的指定类型

ArrayList ls1 = new ArrayList {"a","b","c",1 };

var ls4 = ls1.OfType<string>().Cast<string >();

ls1[0] = 345;

foreach (object s in ls4)

{

System.Console.WriteLine(s);

}

010509_0605_Linq15.png

不延迟(浅复本)

Single 集合中符合条件的唯一元素,浅复本

得到的是复本

集合中没有会报错

集合中有两个以上会报错

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8 };

var v = ls2.Single(p => p==1); //如果集合中没有,或有两个以上会报错,

SingleOrDefault 集合中符合条件的唯一元素(没有则返回类型默认值),浅复本

得到的是复本

集合中没有则返回类型默认值

集合中有两个以上会报错

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8 };

var v = ls2.SingleOrDefault(p => p == 1); //集合中有两个以上会报错,集合中没有则返回类型默认值

First 集合的第一个元素,浅复本

得到的是复本

集合中没有会报错

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8 };

var o = ls.First(); //第一

var o1 = ls.First(p=>p>2); //第一个大于2的

FirstOrDefault 集合中的第一个元素(没有则返回类型默认值),浅复本

得到的是复本

集合中没有则返回类型默认值

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8 };

var o = ls.FirstOrDefault(); //第一个

var o1 = ls.FirstOrDefault(p => p > 2); //第一个大于2的

Last 集合中的最后一个元素,浅复本

得到的是复本

集合中没有会报错

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8,1 };

var o = ls.Last(); //最后一个

var o1 = ls.Last(p => p > 2); //最后一个大于2的

LastOrDefault 集合中的最后一个元素(没有则返回类型默认值),浅复本

得到的是复本

集合中没有则返回类型默认值

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8,1 };

var o = ls.LastOrDefault(); //最后一个

var o1 = ls.LastOrDefault(p => p > 2); //最后一个大于2的

ElementAt 集合中指定索引的元素,浅复本

得到的是复本

集合中没有会报错

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8,1 };

var o = ls.ElementAt(1);

ElementAtOrDefault 集合中指定索引的元素(没有则返回类型默认值),浅复本

得到的是复本

集合中没有则返回类型默认值

List<int> ls = new List<int>() { 1, 3, 2, 2, 5, 2, 8,1 };

var o = ls.ElementAtOrDefault(100);

Contains 判断集合中是否包含有某一元素

public class a

{

static void Main(string[] args)

{

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

T2 obj = new T2() { bak = "sss", ID = "ok" };

ls2.Add(obj);

bool b = ls2.Contains(obj); //true 多肉容见对像比效

}

}

public class T2

{

public string ID;

public string bak;

}

Any 判断集合中是否有元素满足某一条件

public class a

{

static void Main(string[] args)

{

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

bool b1 = ls2.Any(p => p.bak.Contains("ell") ); //true

bool b2 = ls2.Any(p => p.ID=="a" ); //true

}

}

public class T2

{

public string ID;

public string bak;

}

All 判断集合中是否所有元素都满足某一条件

public class a

{

static void Main(string[] args)

{

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

bool b1 = ls2.All(p => p.bak.Contains("e") );//false

bool b2 = ls2.All(p => p.ID.Length ==1 ); //true

}

}

public class T2

{

public string ID;

public string bak;

}

SequenceEqual 判断两个集合内容是否相同

List<int> ls1 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1 };

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1 };

bool b1 = ls2.SequenceEqual(ls1); //true

Count 、LongCount集合中的元素个数

List<int> ls2 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 1 };

int b1 = ls2.Count(p => p < 3); //5

int b2 = ls2.Count(); //8

Average 、Sum集合平均值求和

List<int> ls3 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 2 };

var b1 = ls3.Average(); //3.125

var b2 = ls3.Sum(); //25

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 4 } };

var b1 = ls1.Average(p=>p.Value); //2.33333333333333

var b2 = ls1.Sum(p=>p.Value); //7

}

}

public class T1

{

public string Name;

public int Value;

}

Max、Min 集合最大值,最小值

List<int> ls3 = new List<int>() { 1, 3, 2, 2, 5, 2, 8, 2 };

var b1 = ls3.Min(); //1

var b2 = ls3.Max(); //8

public class a

{

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 4 } };

var b1 = ls1.Min(p=>p.Value); //1

var b2 = ls1.Max(p=>p.Value); //4

}

}

public class T1

{

public string Name;

public int Value;

}

Aggregate 根据输入的表达式获取一个聚合值

List<int> ls3 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9,10 };

var b1 = ls3.Aggregate((x, y) => x + y );//55 累加

var b2 = ls3.Aggregate((x, y) => x * y);//3628800 累乘

public class a

{

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 4 } };

var b3 = ls1.Aggregate<T1>((x, y) => new T1 { Value = x.Value + y.Value });

System.Console.WriteLine(b3.Value); //7

}

}

public class T1

{

public string Name;

public int Value;

}

DefaultIfEmpty 查询结果为空则返回默认值,浅复本

如果集合是的无素为空(count==0),就向集合中插入一个默认元素

List<string > ls3 = new List<string >() { "wxd","lzm","wxwinter" ,"wxd"};

var ls4 = ls3.Where(p => p == "ok").DefaultIfEmpty("not"); ;

//如果不存在返回给集合一个自定义的对象

ToArray 将集合转换为数组,浅复本

List<string > ls3 = new List<string >() { "wxd","lzm","wxwinter" ,"wxd"};

string[] ss = ls3.ToArray();

ToList 将集合转换为List<T>集合,浅复本

List<string > ls3 = new List<string >() { "wxd","lzm","wxwinter" ,"wxd"};

List<string> ss = ls3.ToList();

ls3[0] = "kk"; //不影响 ss 集合

List<string > ls3 = new List<string >() { "wxd","lzm","wxwinter" ,"wxd"};

var ss = ls3.Select(p=>p);

ls3[0] = "kk"; //影响 ss 集合

ToDictionary 将集合转换为<K, V>集合,浅复本

public class a

{

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 4 } };

System.Collections.Generic.Dictionary<string, T1> dd = ls1.ToDictionary(p => p.Name);

var d = ls1.ToDictionary(p => p.Name); //如果集合中有值相同的Name,将报错

//指定对象为键,原集合中的对象为值

foreach (var s in dd)

{

System.Console.WriteLine(s);

}

}

}

public class T1

{

public string Name;

public int Value;

}

010509_0605_Linq16.png

末整理方法

AsQueryable

Lambda表达式

Lambda表达式是委托的一种实现方式。与匿名方法类似。

格式

声名参数

=> 分隔符

表达式

表达式的结果为委托返回值

p => p + 1

p => p < 4

(int p) => p +1

(p1,p2) => p1 + p2

例1(比效)

Lambda表达式

public delegate TR lzm<T, TR>(T v1);

class a

{

public void f(lzm<int, bool> func)

{

bool b= func(100);

if (b)

{

System.Console.WriteLine("v大于100");

}

else

{

System.Console.WriteLine("v小于100");

}

}

}

class Program

{

static void Main(string[] args)

{

a obj = new a();

int v = 70;

obj.f(p => v > p);

obj.f((int p) => v > p); //显示类型

}

}

委托

public delegate TR lzm<T, TR>(T v1);

class a

{

public void f(lzm<int, bool> func)

{

bool b= func(100);

if (b)

{

System.Console.WriteLine("v大于100");

}

else

{

System.Console.WriteLine("v小于100");

}

}

}

class Program

{

static void Main(string[] args)

{

a obj = new a();

obj.f(w);

}

public static bool w(int v1)

{

int v = 70;

bool b = v > v1;

return b;

}

}

匿名方法

public delegate TR lzm<T, TR>(T v1);

class a

{

public void f(lzm<int, bool> func)

{

bool b= func(100);

if (b)

{

System.Console.WriteLine("v大于100");

}

else

{

System.Console.WriteLine("v小于100");

}

}

}

class Program

{

static void Main(string[] args)

{

a obj = new a();

obj.f( delegate(int v1) {return 70 > v1; });

Console.Read();

}

}

例2(多参)

public delegate T lzm<T1, T2, T>(T1 v1, T2 v2);

class a

{

public void f(lzm<int, int, int> func,int x,int y)

{

int b = func(x, y);

System.Console.WriteLine(b);

}

}

class Program

{

static void Main(string[] args)

{

a obj = new a();

obj.f((v1, v2) => v1 - v2,100,200);

Console.Read();

}

}

例3(list.Where)

public class a

{

public int ID { get; set; }

public string Name { get; set; }

public static void Main()

{

List<a> list = new List<a> { new a { ID = 1, Name = "wxd" }, new a { ID = 2, Name = "lzm" }, new a { ID = 3, Name = "wxwinter" } };

var l1 = list.WxdWhere(le => le.Name == "lzm");

// 上面的(Lambda表达式)等同于下面的(匿名方法)

IEnumerable<a> l2 = list.WxdWhere(delegate(a le) { return le.Name == "lzm"; });

//与调用系统Where一样

var l3 = list.Where(le => le.Name == "lzm");

}

}

public static class e

{

// 相关委托

public delegate TResult Func<T, TResult>(T arg);

//相关Where扩展方法

//Func<TSource, bool>:接受一个类型为TSource的参数

//Func<TSource, bool>:某个需要满足的条件,返回bool值

public static IEnumerable<TSource> WxdWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

{

foreach (TSource item in source)

{

if (predicate(item))

{

yield return item;

}

}

}

}

Lambda表达式中Lifting

public class a

{ static void Main(string[] args)

{

List<Func<int>> list = new List<Func<int>>();

for (int i = 0; i < 3; i++)

{

//int temp = i;

// list.Add(() => temp); // 1,2,3 这个temp,就称为lifting。lift是美语中的电梯,翻译为梯子或垫脚石,比较妥帖

list.Add(() => i); //3,3,3

}

foreach (var item in list)

{

Console.WriteLine(item());

}

}

}

010509_0605_Linq17.png

所盼望输出,0,1,2,而实际结果是3,3,3。

两个原因。

第一,在for循环中,只能有一个 i 变量。即再第一次循环时,i 的地址就分配好了,不会因为循环次数的多少而发生任何改变,其改变的只能是里面装载的值。

第二,lambda表达式在构造时,传进去的是变量的地址,而不是具体值。只有当真正执行这个lambda表达式时,才会去确定它的值。这就是为什么上面的例子中,其结果均为3。(for循环在最后,又给 i 加了1)

在for循环中,定义一临时变量temp存储 i的值即可。因为编译器会对该临时变量重新分配内存,这样,每次循环,都重新分配新的内存,就不会有这个问题

010509_0605_Linq18.png

QuerySyntax 查询语法

  1. 查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的声明式简化写法

    每个查询表达式的句法从from子句开始,以select或group子句结束

结果集合 = from 临时变量 in 要查询的集合 [....] select 返回内容;

[结果集合]的类型与[select 返回内容]的类型一样

[....] 其它关键字

  1. 查询句法返回的类型是 System.Collections.IEnumerable System.Collections.Generic.IEnumerable<T>

public class a

{

static void Main(string[] args)

{

List<T> ls = new List<T> { new T { Name = "a", Value = 1 }, new T { Name = "b", Value = 2 }, new T { Name = "c", Value = 3 }, };

var l1 = from temp in ls select temp;

var l2 = from temp in ls select "姓名:" + temp.Name ;

var l3 = from temp in ls where temp.Value <= 2 select temp;

System.Collections.IEnumerable l4 = from temp in ls where temp.Value <= 2 select temp;

System.Collections.Generic.IEnumerable<T> l5 =from temp in ls where temp.Value <= 2 select temp;

}

}

public class T

{

public string Name;

public int Value;

}

3.结果集合以视图方式返回,源集合的内容改变后,会反映到结果集合上。在Select时New全新的对像也是这种情况,因为[结果集合]是动态的,每次访问都按查询句重新生成

public class a

{

static void Main(string[] args)

{

List<T> ls = new List<T> { new T { Name = "a", Value = 1 }, new T { Name = "b", Value = 2 }, new T { Name = "c", Value = 3 }, };

var l3 = from temp in ls select new T2 { x=temp.Name , y=temp.Value , z=000};

foreach (var s in l3)

{ Console.WriteLine(s.x + s.y + s.z); }

ls[0].Name = "wxd";

foreach (var s in l3)

{ Console.WriteLine(s.x + s.y + s.z);}

System.Console.Read();

}

}

public class T

{

public string Name;

public int Value;

}

public class T2

{

public string x;

public int y;

public int z;

}

010509_0605_Linq19.png

  1. 如果不要延迟查询运算,而是要对它们立刻就执行运算,

    可以使用内置的ToList() 和ToArray() 运算符来返回一个包括了结果集的List<T>或者数组。

List<int> ls = new List<int>() { 1, 2, 3, 4, 5 };

// var l3 = (from temp in ls select temp);

var l3 = (from temp in ls select temp).ToList() ;

from in select

class Program

{

static void Main(string[] args)

{

List<T> ls = new List<T> { new T { Name = "a", Value = 1 }, new T { Name = "b", Value = 2 }, new T { Name = "c", Value = 3 }, };

List<int> li = new List<int> {1,2 };

var l1 = from temp1 in ls

from temp2 in li

where temp1.Value == temp2

select new { temp1.Name, v = temp2 * 100 }; //返回一个新的匿名类的集合

}

}

public class T

{

public string Name;

public int Value;

}

orderby 排序

orderby 字段,字段 descending /ascending

public class a

{

static void Main(string[] args)

{

List<T> ls = new List<T> { new T { Name = "a", Value = 1 }, new T { Name = "b", Value = 2 }, new T { Name = "c", Value = 3 }, };

var l1 = (from temp in ls orderby temp.Value, temp.Name select temp);

var l2 = (from temp in ls orderby temp.Value descending select temp);

var l3 = (from temp in ls where temp.Value < 5 orderby temp.Value ascending select temp);

var l4 = (from temp in ls orderby temp.Value ascending where temp.Value < 5 select temp);

}

}

public class T

{

public string Name;

public int Value;

}

group by into 分组

分组结果集合 = from 临时变量A in 要查询的集合

group 临时变量A by 分组关键字 into 临时变量B

select 临时变量B

其中的 into 关键字表示 将前一个查询的结果视为后续查询的生成器,这里是跟 group by 一起使用的。

分组结果集合

System.Collections.Generic.IEnumerable<System.Linq.IGrouping<TKey,TElement>>

010509_0605_Linq20.png

public class a

{

static void Main(string[] args)

{

List<T> ls = new List<T> { new T { Name = "a", Value = 1 }, new T { Name = "b", Value = 2 }, new T { Name = "c", Value = 3 }, new T { Name = "d", Value = 1 }, new T { Name = "e", Value = 3 } };

var l1 = from temp in ls

group temp by temp.Value into gp

select gp;

var l2 = from temp in ls

orderby temp.Name descending //对ls的结果集合排序

group temp by temp.Value into gp

orderby gp.Key descending //对组集合排序

select gp;

System.Collections.Generic.IEnumerable<System.Linq.IGrouping<int,T>> l3 = from temp in ls

group temp by temp.Value into gp

select gp;

foreach (var s in l2)

{

Console.WriteLine("{0}组",s.Key);

foreach (var ss in s)

{

Console.WriteLine(ss.Name);

}

}

}

}

public class T

{

public string Name;

public int Value;

}

010509_0605_Linq21.png

string[] wxd = { "Java", "C#", "C++", "Delphi", "VB.net", "VC.net", "C++ Builder", "Kylix", "Perl", "Python" };

var query = from item in wxd

orderby item

group item by item.Length into lengthGroups

orderby lengthGroups.Key descending

select lengthGroups;

foreach (var item in query)

{

Console.WriteLine("长度 {0}", item.Key);

foreach (var val in item)

{

Console.WriteLine(val);

}

}

010509_0605_Linq22.png

join in on equals 联合查询

public class a

{

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 3 } };

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

//返回一个新的匿名类的集合

var li = from temp1 in ls1 join temp2 in ls2 on temp1.Name equals temp2.ID select new { temp1.Name, temp1.Value, temp2.ID, temp2.bak };

foreach (var s in li)

{

Console.WriteLine("{0}-{1}-{2}-{3}",s.Name,s.ID,s.Value,s.bak);

}

}

}

public class T1

{

public string Name;

public int Value;

}

public class T2

{

public string ID;

public string bak;

}

010509_0605_Linq23.png

into 汇总

static void Main(string[] args)

{

List<T1> ls1 = new List<T1> { new T1 { Name = "a", Value = 1 }, new T1 { Name = "b", Value = 2 }, new T1 { Name = "c", Value = 3 } };

List<T2> ls2 = new List<T2> { new T2 { ID = "a", bak = "hello" }, new T2 { ID = "a", bak = "wxwinter" }, new T2 { ID = "c", bak = "lzm" }, };

//返回一个新的匿名类的集合

var li = from temp1 in ls1

join temp2 in ls2 on temp1.Name equals temp2.ID

into newtab

select new { temp1.Name, temp1.Value, 个数 = newtab.Count() };

foreach (var s in li)

{

Console.WriteLine("Name :{0},共有:{1}",s.Name,s.个数.ToString());

}

}

}

public class T1

{

public string Name;

public int Value;

}

public class T2

{

public string ID;

public string bak;

}

010509_0605_Linq24.png

DataSource 数据绑定

public class aa

{

public string a

{ get; set; }

public string b

{ get; set; }

}

winform

List<aa> ls = new List<aa> { new aa { a = "a", b = "1" }, new aa { a = "b", b = "2" } };

dataGridView1.DataSource = ls; //数据修改会与集合同步

//两个控件指针会同步

comboBox1.DataSource = ls;

comboBox1.DisplayMember = "b";

010509_0605_Linq25.png

aspnet

protected void Button1_Click(object sender, EventArgs e)

{

List<aa> ls = new List<aa> { new aa { a = "a", b = "1" }, new aa { a = "b", b = "2" } };

this.GridView1.DataSource = ls;

DropDownList1.DataSource = ls;

DropDownList1.DataTextField = "b";

DropDownList1.DataValueField = "a";

this.DataBind();

}

转载于:https://www.cnblogs.com/Tim_Liu/archive/2011/03/30/1999963.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转:Linq基础学习 的相关文章

  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • .Error (10200): Verilog HDL Conditional Statement error at : cannot match operand(s) in the conditio...

    always 记得初始化使用数据 加上 if rst n 不要直接接if dsp xint1 转载于 https www cnblogs com navieli archive 2013 03 11 2954183 html
  • 【Mo 人工智能技术博客】使用 Seq2Seq 实现中英文翻译

    1 介绍 1 1 Deep NLP 自然语言处理 Natural Language Processing NLP 是计算机科学 人工智能和语言学领域交叉的分支学科 主要让计算机处理或理解自然语言 如机器翻译 问答系统等 但是因其在表示 学习
  • python计算高德地图距离和面积

    python计算高德地图距离和面积 因为项目中经常使用高德的距离和面积计算组件 但是高德并未公布计算逻辑 这就导致项目中数据出问题时不知道该如何去定位 因此花费了1天时间把距离计算和面积计算用python语言整理了出来 距离计算公式 fro
  • VUE首屏加载loading效果

    在使用乾坤微前端框架中 遇见图片资源路径存在访问问题 在不搭CDN的情况下 使用base64方式将图片资源打入代码 这样会导致包体积过大 加载时间长 所以加了一个loading效果 1 在index html入口增加 loading li
  • @Profile使用及SpringBoot获取profile值

    之前开发用过 maven 的环境隔离 现在使用springboot的 Profile功能 发现spring体系真的大到我只是学习了皮毛 相比面试问的 IOC bean的作用域等 突然觉得很可笑 官方文档关于 Profile 的使用 http
  • 删除两个字典中非公共的键和值

    删除两个字典中非公共的键和值 需求 对比两个字典 找出公共元素 将非公共元素删除 dict1 dict2 res for i in dict1 if i not in dict2 print i del dict1 i res append
  • Vue3项目中使用TypeScript

    单文件用法 在单文件组件中使用 TypeScript 需要在 小结 注意 当 script 中使用了 ts 模板 template 在绑定表达式时也支持ts 如果在表达式中不指名类型时 编译器会报警告提示 正确写法 表达式指定类型 组合式A
  • 一文说清楚c++模板Template的用法

    一 引言 模板 Template 指c 程序设计语言中采用类型作为参数的程序设计 二 函数模板 1 通用格式 函数模板定义格式 template
  • Git:同步他人的远程仓库至自己的Git服务器并自动定时更新

    昨天晚上将2015年一篇不负责的Git服务器搭建的教程更新了一下 详见 在CentOS下搭建自己的Git服务器及使用nginx配置gitweb面板 今天折腾了一些本地的项目 倒是可以了 现在的需要是 将远程的仓库 同步一份到自己的git服务
  • C#复习题1(含答案及解析)

    1 单选题 下面有关for循环的正确描述是 A for循环只能用于循环次数已经确定的情况 B for循环的执行流程是先执行循环体语句 后判断表达式 C 在for循环中 表达式1和3可以省略 但表达式2是不能省略 D for循环的循环体中 可
  • JVM黑马版:笔记、应用、速查

    前言 由于工作中时常和JVM打交道 但是对JVM的体系缺乏系统深入了解 日前跟随b站上黑马程序猿的课程成体系地学习了JVM 结合工作中的实践写就了此笔记 黑马原视频地址 https www bilibili com video BV1yE4
  • 无域名家庭异地组网 Headscale +自建 DERP 中继服务器

    参考资料 Headscale 自部署 Tailscale 服务端 泠泫凝的异次元空间 lxnchan cn 20条消息 比 Tailscale 更好的内网穿透方案 Headscale 米开朗基杨的博客 CSDN博客 156条消息 自建 DE
  • Microsoft Access database engine 2010 (Chinese (Simplif... 您不能安装64位版本的Microsoft Access 2010 数据库引擎

    问题 Microsoft Access database engine 2010 Chinese Simplif 您不能安装64位版本的Microsoft Access 2010 数据库引擎 因为您当前已安装32位的offce 产品 若要安
  • Python render_notebook()画图不显示

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 使用jupyter lab画图 render notebook 画图不显示 解决方法 from pyecharts globals import CurrentConfig Note
  • p值小于0.05拒绝还是接受_数据科学20

    1 假设检验 假设检验用来判断样本与样本 样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法 零假设H0 差异是由抽样误差引起的 一般形式是假定参数等于某个固定值 如假设组间差异为0 回归系数为0等 备择假设H1 存在本质差异
  • 伺服电机脉冲控制方式

    伺服电机脉冲控制方式 伺服电机控制方式有脉冲 模拟量和通讯控制这三种 在不同的应用场景下 该如何确定选择伺服电机控制方式 1 伺服电机脉冲控制方式 在一些小型单机设备 选用脉冲控制实现电机的定位 应该是最常见的应用方式 这种控制方式简单 易
  • Django,Flask ,FastAPI 怎么选?

    阅读大约需要 4 5 分钟 首先我们达成一个共识 框架是用来帮助我们提升效率 节省时间 避免处理那些低级细节的 如果能达到这个目标 就是一个合适的框架 选择合适的框架 会事半功倍 Python 领域 开发 Web 应用程序的三个主流框架是
  • 面试准备:Java常见面试题汇总(一)

    面试准备 Java常见面试题汇总 一 面试准备 Java常见面试题汇总 二 面试准备 Java常见面试题汇总 三 文章目录 1 面向对象的特点 特性有哪些 补充 Java的多态是编译时多态还是运行时多态 2 接口和抽象类的相同点和不同点 3
  • cin输入错误类型导致的死循环

    项目场景 温故而知新 C 学习cin函数 循环读取数据 问题描述 cin函数读取到错误的数据类型时 导致跳过之后所有的cin操作 导致陷入死循环 void main while 1 int a 1 cout lt lt 请输入手机号 cin
  • 转:Linq基础学习

    本文为转摘博客园大牛文章之一 原文地址 http www cnblogs com foundation archive 2009 01 05 1369371 html 目录 1 LINQ查询结果集 1 2 System Array 数组 1