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);
    }

}
posted @ 2011-07-16 09:49  heqichang  阅读(904)  评论(0编辑  收藏  举报