广西住房建设厅网站,广州seo工作,牡丹江最新通知今天,访问一个网站的过程【.NET Core】Linq查询运算符#xff08;一#xff09; 文章目录 【.NET Core】Linq查询运算符#xff08;一#xff09;一、概述二、筛选数据三、投影运算3.1 Select 3.2 SelectMany3.3 Zip3.4 Select 与 SelectMany 四、Set#xff08;设置#xff09;运算4.1 Distinct…【.NET Core】Linq查询运算符一 文章目录 【.NET Core】Linq查询运算符一一、概述二、筛选数据三、投影运算3.1 Select 3.2 SelectMany3.3 Zip3.4 Select 与 SelectMany 四、Set设置运算4.1 Distinct或DistinctBy4.2 Except或ExceptBy4.3 Intersect或IntersectBy4.4 Union或UnionBy 五、对数据进行排序5.1 OrderBy5.2 OrderByDescending5.3 ThenBy5.4 ThenByDescending5.5 Reverse() 六、限定符运算6.1 All6.2 Any6.2 Contains 七、数据分区7.1 Skip7.2 SkipWhile7.3 Take7.4 TakeWhile7.5 Chunk 一、概述
查询运算符是组成Linq模式的方法。这些方法中的大多数都作用于序列其中序列指其类型实现IEnumberableT接口或IQueryableT接口的对象。标准查询运算符提供包括筛选、投影、集合、排序等查询功能。
查询运算符包含两组一组作用于类型IEnumberableT的对象另一组作用于类型IQueryableT的对象。
二、筛选数据
筛选是指将结果集限制为仅包含满足指定条件的元素的操作。它也称为选定内容。筛选数据方法包含OfType和Where。
string[] list[A,AB,BC,CD,DE,EF];
IEnumerablestring query from chars in list where chars.Contains(B) select chars;
foreach(string ch in query){Console.WriteLine(str);
}运行结果
AB
BC三、投影运算
投影是指将对象转换为一种新形式的操作该形式通常只包含那些将随后使用的属性。通过使用投影可以构造从每个对象生成的新类型。可以投影属性并对属性执行数学函数。
3.1 Select
string[] list{A,AB,BC,CD,DE,EF};
IEnumerablestring query from chars in list select chars.ToLower();
foreach(string ch in query){Console.WriteLine(str)
}运行结果
a
ab
bc
cd
de
ef3.2 SelectMany
使用多个from子句来投影字符串列表中每个字符串的每个字符转变为大写。
string[] list { A|B|C|D,E|F|G|H};
IEnumerablestring query from chars in list from ch in chars.Split(|)select ch;
foreach (string ch in query)
{Console.WriteLine(ch)
}运行结果
A
B
C
D
E
F
G
H3.3 Zip
Zip投影运算符有多个重载所有Zip方法都处理两个或更多可能是异构类型的序列。前两个重载返回元组具有来自给定序列的响应位置类型。
int[] index { 1, 2, 3 };
string[] chars { A, B, C };
IEnumerablestring zip chars.Zip(index, (n, w) n w);
foreach (var z in zip)
{Console.WriteLine(z);
}运行结果
A1
B2
C3zip操作生成的序列的长度永远不会长于最短序列。index和letters集合的长度不同生成的序列将省略index集合中的最后一个元素因为它没有任何要压缩的内容。 3.4 Select 与 SelectMany
Select与SelectMany的工作都是依据源生成一个或多个结构值。Select为每个源值生成一个结构值。因此总体结构是一个与源集合具有相同元素数目的集合。 与之相反SelectMany 生成单个总体结果其中包含来自每个源值的串联子集合。 作为参数传递到 SelectMany 的转换函数必须为每个源值返回一个可枚举值序列。 然后SelectMany 串联这些可枚举序列以创建一个大的序列。
四、Set设置运算
LINQ 中的集运算是指根据相同或不同集合或集中是否存在等效元素来生成结果集的查询运算。
4.1 Distinct或DistinctBy
删除集合中的重复元素
int[] index { 1, 2, 3 ,4};
string[] chars { A, B, C , B, C ,D};
IEnumerablestring zip from ch in chars.Distinct() select ch;
foreach (var z in zip)
{Console.WriteLine(z);
}运行结果
A
B
C
D在新.NET Framework中可以使用DistinctBy替代Distinct,DistinctBy采用keySelector。keySelector用作源类型的比较鉴别器。
4.2 Except或ExceptBy
Except返回的序列只包含位于第一个输入序列但不位于第二个输入序列的元素。
string[] listA { A, B, AC, BC, CD };
string[] chars { A, B, C , B, C ,D};
IEnumerablestring listC from ch in chars.Except(listA) select ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
C
DExceptBy 方法是 Except 的替代方法它采用可能是异构类型的两个序列和一个 keySelector。 keySelector 与第二个集合的类型相同用作源类型的比较鉴别器。
4.3 Intersect或IntersectBy
返回序列包含两个输入序列共有的元素。
string[] listA { A, B, AC, BC, CD };
string[] chars { A, B, C , B, C ,D};
IEnumerablestring listC from ch in chars.Intersect(listA) select ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
A
BIntersectBy方法是Intersect的替代方法它采用可能是异构类型的两个序列和一个keySelector。keySelector用作第二个集合类型的比较鉴别器。
4.4 Union或UnionBy
两个字符串序列执行的联合操作。返回的序列包含两个输入序列的唯一元素。
string[] listA { A, B, AC, BC, CD };
string[] chars { A, B, C , B, C ,D};
IEnumerablestring listC from ch in chars.Union(listA) select ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
A
B
C
D
AC
BC
CD五、对数据进行排序
排序操作基于一个或多个属性对序列的元素进行排序。 第一个排序条件对元素执行主要排序。 通过指定第二个排序条件您可以对每个主要排序组内的元素进行排序。
5.1 OrderBy
结果集按升序对值排序。
string[] listA { A, B, AC, BC, CD };
string[] chars { A, B, C , B, C ,D};
IEnumerablestring listC from ch in chars.Union(listA) orderby ch select ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
A
AC
B
BC
C
CD
D5.2 OrderByDescending
按降序对值排序。C#查询表达式语法orderby… descending
string[] listA { A, B, AC, BC, CD };
string[] chars { A, B, C , B, C ,D};
IEnumerablestring listC from ch in chars.Union(listA) orderby ch descending select ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
D
CD
C
BC
B
AC
A5.3 ThenBy
按升序执行次要排序。orderby...,...
string[] listA { A, B, AC, BC, CD };
string[] chars { A, B, C , B, C ,D};
IEnumerablestring listC from ch in chars.Union(listA) orderby ch,ch.Length select ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
A
AC
B
BC
C
CD
D5.4 ThenByDescending
按降序执行次要顺序。C#查询表达式语法orderby…,… descending。
string[] listA { AB, DC, ED, FH, Z };
IEnumerablestring listC from ch in listAorderby ch descending,ch.Length descendingselect ch;
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
Z
FH
ED
DC
AB5.5 Reverse()
反转集合中元素的顺序
string[] listA { AB, DC, ED, FH, Z };
IEnumerablestring listC listA.Reverse();
foreach (var z in listC)
{Debug.WriteLine(z);
}运行结果
Z
FH
ED
DC
AB六、限定符运算
限定符运算返回一个Boolean值该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。
6.1 All
全部确定是否序列中的所有元素都满足条件
class Marketing
{public string Name{get;set;}public string[] Items{get;set;}
}
public static void Main(string[] args)
{ListMarketing markets{new Market { Name Emilys, Items {kiwi, cheery, banana} },new Market { Name Kims, Items {melon, mango, olive} },new Market { Name Adams, Items {kiwi, apple, orange} },} var names from marker in marketswhere marker.Items.All(itemitem.Length 5)select Name;foreach(string name in namse){Debug.WriteLine(name);}
}
6.2 Any
使用Any检查所有字符串是否以“o”开头。
class Market
{public string Name{get;set;}public string[] Items{get;set;}
}
public static void Main(string[] args)
{ListMarket markets{new Market { Name Emilys, Items {kiwi, cheery, banana}},new Market { Name Kims, Items {melon, mango, olive} },new Market { Name Adams, Items {kiwi, apple, orange} }, }IEnumerablestring names from market in marketswhere market.Items.Any(itemitem.StartsWith(o))select market.Name;foreach(string name in names){Debug.WriteLine(name);}
}6.2 Contains
Contains检查所有数组是否具有特定元素。
class Market
{public string Name{get;set;}public string[] Items{get;set;}
}
public static void Main(string[] args)
{ListMarket markets{new Market { Name Emilys, Items {kiwi, cheery, banana}},new Market { Name Kims, Items {melon, mango, olive} },new Market { Name Adams, Items {kiwi, apple, orange} }, }IEnumerablestring names from market in marketswhere market.Items.Contains(kiwi)select market.Name;foreach(string name in names){Debug.WriteLine(name);}
}七、数据分区
Linq中的数据分区是指将输入序列划分为两个部分的操作无需重新排列元素然后返回其中一个部分。
7.1 Skip
Skip跳过序列中指定位置之前的元素。
string[] items {A, B,C,D,E,F,G,H,I};
var item items.Skip(5);
foreach (var it in item)
{Console.WriteLine(it);
}运行结果
F
G
H
I7.2 SkipWhile
Skip指定跳过的数目SkipWhile指定的跳过条件而不是元素数。
string[] texts new string[] { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
IEnumerablestring skippedTexts texts.SkipWhile(value value.EndsWith(n));
foreach (var it in skippedTexts)
{Console.WriteLine(it);
}运行结果
Tue
Wed
Thu
Fri
Sat7.3 Take
获取序列中指定位置之前的元素
string[] texts new string[] { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
// 删除尾字母为n的
IEnumerablestring skippedTexts texts.Take(3);
foreach (var it in skippedTexts)
{Console.WriteLine(it);
}运行结果
Sun
Mon
Tue7.4 TakeWhile
TakeWhile操作符用于从输入序列中返回指定数量且满足一定条件的元素。
当TakeWhile操作符被调用时会将source序列中的每一个元素顺序传递给委托predicate,只有哪些使用得predicate返回值为true的元素才会被添加到结果序列中要特别注意是当TakeWhile操作符在查找过程中遇到第一个返回false的元素就会立即停止执行跳出无论后面还有没有符合条件的元素即使后面有符合条件的元素也不会获取。对于第二个扩展方法委托里面含有一个int类型的参数。
string[] lists [a, e, i, o, u];
var takeList lists.TakeWhile(x x ! i);
foreach (var al in takeList)
{Console.WriteLine(al);
}运行结果
a
e7.5 Chunk
chunk 该方法将序列的元素拆分为指定大小的区块
string[] lists {公孙胜,鲁智深,林冲,吴用,李逵,宋江,武松 };
var nameList lists.Chunk(3);
foreach (var names in nameList)
{foreach (var name in names) {Trace.WriteLine(name);}Trace.WriteLine(****************);
}运行结果
公孙胜
鲁智深
林冲
****************
吴用
李逵
宋江
****************
武松
****************