zoukankan      html  css  js  c++  java
  • Enumerable 类中的几个Linq方法

    一直没好好地学习一下LINQ,只会平时常用的一几个。

    师傅这几天问到,就顺便整理了一下。

    以下是几个平时未用到的。




    一、ToLookup

    签名:

    public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(
    	this IEnumerable<TSource> source,
    	Func<TSource, TKey> keySelector
    )



    解说:

    与GroupBy功能差不多,都会创建类字典集合,区别在于:
    GroupBy是延迟加载,所以即使使用GroupBy得到结果集合,若原操作目标集合发生改变,那结果集合的元素也会发生相应的改变。
    创建一个ILookup集合,此集合不像Dictionary,其元素是不可改变的。
    非延迟执行。

    示例:

            public sealed class Product
            {
                public int Id { get; set; }
                public string Category { get; set; }
                public double Value { get; set; }
    
                public override string ToString()
                {
                    return string.Format("[{0}: {1} - {2}]", Id, Category, Value);
                }
            }
    
            public static void Test()
            {
                var products = new List<Product> 
                            { 
                                new Product {Id = 1, Category = "Electronics", Value = 15.0}, 
                                new Product {Id = 2, Category = "Groceries", Value = 40.0}, 
                                new Product {Id = 3, Category = "Garden", Value = 210.3}, 
                                new Product {Id = 4, Category = "Pets", Value = 2.1}, 
                                new Product {Id = 5, Category = "Electronics", Value = 19.95}, 
                                new Product {Id = 6, Category = "Pets", Value = 21.25}, 
                                new Product {Id = 7, Category = "Pets", Value = 5.50}, 
                                new Product {Id = 8, Category = "Garden", Value = 13.0}, 
                                new Product {Id = 9, Category = "Automotive", Value = 10.0}, 
                                new Product {Id = 10, Category = "Electronics", Value = 250.0}, 
                            };
    
                //若使用GroupBy,则所有Garden产品最后不会被打印出来
                //若使用ToLookup,则所有Garden产品最后还是会被打印出来
                var groups = products.ToLookup(pr => pr.Category);
    
                //删除所有属于Garden的产品
                products.RemoveAll(pr => pr.Category == "Garden");
    
                //打印结果
                foreach (var group in groups)
                {
                    Console.WriteLine(group.Key);
                    foreach (var item in group)
                    {
                        Console.WriteLine("\t" + item);
                    }
                }
            }




    二、Zip

    签名:

    public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
    	this IEnumerable<TFirst> first,
    	IEnumerable<TSecond> second,
    	Func<TFirst, TSecond, TResult> resultSelector
    )



    解说:

    合并两个序列。
    结果序列的元素个数为两个序列中的元素个数较少的。
    延迟执行。

    示例:

                int[] numbers = { 1, 2, 3, 4 };
                string[] words = { "one", "two", "three" };
    
                var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);
    
                foreach (var item in numbersAndWords)
                    Console.WriteLine(item);
    
                // This code produces the following output:
    
                // 1 one
                // 2 two
                // 3 three




    三、Repeat

    签名:

    public static IEnumerable<TResult> Repeat<TResult>(
    	TResult element,
    	int count
    )



    解说:

    生成包含一个重复值的序列
    注意非扩展方法。
    延迟执行。

    示例:


                IEnumerable<string> strings = Enumerable.Repeat("I like programming.", 15);
    
                foreach (String str in strings)
                {
                    Console.WriteLine(str);
                }
    
                /*
                 This code produces the following output:
    
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                 I like programming.
                */


    四、Range

    签名:

    public static IEnumerable<int> Range(
    	int start,
    	int count
    )



    解说:

    生成指定范围内的整数的序列。
    延迟执行。

    示例:

                IEnumerable<int> squares = Enumerable.Range(1, 5);
    
                foreach (var num in squares)
                {
                    Console.WriteLine(num);
                }
    
                /*
                 This code produces the following output:
    
                 1
                 2
                 3
                 4
                 5
                */




    五、OfType

    签名:

    public static IEnumerable<TResult> OfType<TResult>(
    	this IEnumerable source
    )
    



    解说:

    根据指定类型筛选 IEnumerable 的元素。
    延迟执行。

    示例:

                System.Collections.ArrayList fruits = new System.Collections.ArrayList(4);
                fruits.Add("Mango");
                fruits.Add("Orange");
                fruits.Add("Apple");
                fruits.Add(3.0);
                fruits.Add(4.0);
                fruits.Add(5);
                fruits.Add("6.0");
    
                // Apply OfType() to the ArrayList.
                IEnumerable<double > query1 = fruits.OfType<double>();
    
                Console.WriteLine("Elements of type 'double' are:");
                foreach (var element in query1)
                {
                    Console.WriteLine(element);
                }
    
                // This code produces the following output:
                //
                // Elements of type 'double' are:
                // 3
                // 4





    六:Join

    签名:

    public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(
    	this IEnumerable<TOuter> outer,
    	IEnumerable<TInner> inner,
    	Func<TOuter, TKey> outerKeySelector,
    	Func<TInner, TKey> innerKeySelector,
    	Func<TOuter, TInner, TResult> resultSelector
    )



    解说:

    延迟执行。
    用法与SQL中的JOIN用法相似,参考以下的SQL:
    USE pubs
    SELECT a.au_fname, a.au_lname, p.pub_name
    FROM authors a LEFT OUTER JOIN publishers p
    ON a.city = p.city

    示例:

            class Person
            {
                public string Name { get; set; }
            }
    
            class Pet
            {
                public string Name { get; set; }
                public Person Owner { get; set; }
            }
    
            public static void JoinEx1()
            {
                Person magnus = new Person { Name = "Hedlund, Magnus" };
                Person terry = new Person { Name = "Adams, Terry" };
                Person charlotte = new Person { Name = "Weiss, Charlotte" };
    
                Pet barley = new Pet { Name = "Barley", Owner = terry };
                Pet boots = new Pet { Name = "Boots", Owner = terry };
                Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
                Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
    
                List<Person> people = new List<Person> { magnus, terry, charlotte };
                List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };
    
                // Create a list of Person-Pet pairs where 
                // each element is an anonymous type that contains a
                // Pet's name and the name of the Person that owns the Pet.
                var query =
                    people.Join(pets,
                                person => person,
                                pet => pet.Owner,
                                (person, pet) =>
                                    new { OwnerName = person.Name, Pet = pet.Name });
    
                foreach (var obj in query)
                {
                    Console.WriteLine(
                        "{0} - {1}",
                        obj.OwnerName,
                        obj.Pet);
                }
            }
    
            /*
             This code produces the following output:
    
             Hedlund, Magnus - Daisy
             Adams, Terry - Barley
             Adams, Terry - Boots
             Weiss, Charlotte - Whiskers
            */


  • 相关阅读:
    体验cygwin纪实
    播布客视频PIT专用播放器MBOO2015
    rpm基本命令参考
    rhel7.x配置本地yum
    mtr网络连通性测试
    Oracle下载汇聚
    Spring Cloud心跳监测
    Hystrix的用法
    Redis系列十:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
    dubbo异步调用三种方式
  • 原文地址:https://www.cnblogs.com/beta2013/p/3377331.html
Copyright © 2011-2022 走看看