Linq学习总结(5)——标准查询运算符
筛选信息
在Linq中可以通过两种方法筛选信息,where和OfType。Where子句大家应该都很熟,OfType是用于筛选能够转换为特定类型的值。
static void Main(string[] args)
{
Object[] objects = new Object[] { 123, "hello", 67.5f, 7M, "six", 89, true };
var intArray = objects.OfType<int>();
foreach (var item in intArray)
{
Console.WriteLine(item);
}
/*Output
* 123
* 89
*/
}
限定符
限定符All、Any、Contains都是扩展方法,他们返回一个布尔值,指示集合中的部分或者全部元素是否满足限定符的参数条件。All判断是否每个成员都满足条件。Any返回一个布尔值,指示是否有满足条件的成员。Contains用于查询符合条件的单个元素。
class Program
{
static void Main(string[] args)
{
var persons = new List<Person>{new Person{Name="Jack",Gender="Male",Age="32"}
,new Person{Name="Chris",Gender="Male",Age="27"}
,new Person{Name="Paul",Gender="Male",Age="25"}
};
bool anyJack = persons.Any(m => m.Name == "Jack");
Console.WriteLine("是否有人叫Jack:{0}",anyJack);
bool allMale = persons.All(m => m.Gender == "Male");
Console.WriteLine("是否都是男性:{0}",allMale);
/*Output
* 是否有人叫Jack:true
* 是否都是男性:true
*/
}
}
class Person
{
public String Name { get; set; }
public String Gender { get; set; }
public String Age { get; set; }
public override string ToString()
{
return string.Format("Name={0},Gender={1},Age={2}", Name, Gender, Age);
}
}
分区操作
Skip、skipWhile、Take和TakeWhile用于将集合拆分成两个部分并返回其中的一个。Skip会根据你输入的整数参数跳到相应的位置,并返回之后的所有元素;SkipWhile会根据你输入的条件,跳到直到你第一个输入条件为假的元素位置,并返回之后的所有元素;Take会返回你指定位置之前的 所有元素;TakeWhile会跳到直到你第一个输入条件为假的元素位置,并返回之前的所有元素。
static void Main(string[] args)
{
int[] ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result1 = ints.Take(5);
Array.ForEach(result1.ToArray(), n => Console.Write(string.Format("{0} ", n)));
Console.WriteLine();
var result2 = ints.Skip(5);
Array.ForEach(result2.ToArray(), n => Console.Write(string.Format("{0} ", n)));
Console.WriteLine();
var result3 = ints.TakeWhile(n => n < 5);
Array.ForEach(result3.ToArray(), n => Console.Write(string.Format("{0} ", n)));
Console.WriteLine();
var result4 = ints.SkipWhile(n => n < 5);
Array.ForEach(result4.ToArray(), n => Console.Write(string.Format("{0} ", n)));
Console.WriteLine();
/*Output
* 1 2 3 4 5
* 6 7 8 9 10
* 1 2 3 4
* 5 6 7 8 9 10
*/
}
生成运算
生成运算有DefaultIfEmpty、Empty、Range以及Repeat。
DefaultIfEmpty在一个序列为空时,生成单一序列的默认值;如果序列不为空,则直接返回序列。这个方法在联接查询中很有用。
static void Main(string[] args)
{
List<int> numbers = new List<int>();
Console.WriteLine(numbers.Count);
var defalutNumbers = numbers.DefaultIfEmpty();
Console.WriteLine(defalutNumbers.Count());
/*Output
* 0
* 1
*/
}
Empty会根据传入的参数生成一个空的序列。
static void Main(string[] args)
{
var empties = Enumerable.Empty<int>();
Console.WriteLine(empties.Count());
/*Output
* 0
*/
}
Range会生成指定范围的数列,它有两个参数,第一个参数为序列中第一个数的值,第二个参数为生成数列的个数。
static void Main(string[] args)
{
var numbers = Enumerable.Range(0, 10);
foreach (var item in numbers)
{
Console.WriteLine(item);
}
/*Output
* 0
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
*/
}
Repeat用来生成一个重复的数列。
static void Main(string[] args)
{
var repeatStr = Enumerable.Repeat<String>("Jim", 10);
foreach (var item in repeatStr)
{
Console.WriteLine(item);
}
//输出十行Jim
}
相等性操作
SequenceEqual和Except可以用来比较数列的相等性和计算差集。
static void Main(string[] args)
{
int[] nums1 = { 1, 2, 3 };
int[] nums2 = { 1, 2, 3 };
int[] nums3 = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums1.SequenceEqual(nums2));
Console.WriteLine(nums1.SequenceEqual(nums3));
var exceptNums = nums3.Except(nums1);
foreach (var item in exceptNums)
{
Console.WriteLine(item);
}
/*Output
* Ture
* False
* 4
* 5
*/
}
获取指定元素操作
获取指定元素操作方法有:ElementAt、ElementAtOrDefault、Frist、FristOfDefault、Last、LastOrDefault、Single以及SingleOrDefault。
ElementAt返回序列中的指定的元素。ElementAtOrDefault返回序列中指定元素,如果超出序列范围,则返回该类型的默认值。Frist返回序列中的第一个元素。FristOfDefault返回序列中满足条件的第一个元素,没有则返回一个默认值。Last和LastOfDefault方法与Frist和FirstOfDefault一样,不过是返回最后一个。Single是返回集合中的唯一条件。SingleOrDefault则返回序列中满足条件的唯一值,如果没有则返回默认值。
static void Main(string[] args)
{
var numbers = Enumerable.Range(0, 9);
//elementAt
var elemnt = numbers.ElementAt(5);
Console.WriteLine("Element at 5 is {0}",elemnt);
//elementOrDefault
var elemntOrDefault = numbers.ElementAtOrDefault(11);
Console.WriteLine("Element at 11 or default is {0}",elemntOrDefault);
//frist
var fristNumber = numbers.First();
Console.WriteLine("Frist:{0}",fristNumber);
//fristOrDefault
var fristOrDefault = numbers.FirstOrDefault(n => n > 10);
Console.WriteLine("Frist Or Default",fristOrDefault);
//single
var single = numbers.Single(n => n == 5);
Console.WriteLine("Single:{0}",single);
//singleOrDefault
var singleOrDefault = numbers.SingleOrDefault(n => n == 11);
Console.WriteLine("Single or default:{0}",singleOrDefault);
}
串联序列
Conect将一个序列附加到另一个序列上。
static void Main(string[] args)
{
var fristNumbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var secondNumbers = new int[] { 10,11,12,13,14,15,16,17,18,19};
var conectNumbers = fristNumbers.Concat(secondNumbers);
foreach (var item in conectNumbers)
{
Console.WriteLine(item);
}
}
浙公网安备 33010602011771号