zoukankan      html  css  js  c++  java
  • [C#] LINQ之LookUp

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢!

              本文作者文采欠佳,文字表达等方面不是很好,但实际的代码例子是非常实用的,请作参考。

    一、先准备要使用的类:

    1、Person类:

        class Person
        {
            public string Name { set; get; }
            public int Age { set; get; }
            public string Gender { set; get; }
            public override string ToString() => Name;
        }

    2、准备要使用的List,用于查找(ToLookUp,类似分组):

            List<Person> personList = new List<Person>
            {
                new Person
                {
                    Name = "P1", Age = 18, Gender = "Male"
    
                },
                new Person
                {
                    Name = "P2", Age = 19, Gender = "Male",
                },
                new Person
                {
                    Name = "P2", Age = 17,Gender = "Female",
                }
            };

    3、ToLookUp与GroupBy的功能基本一样,但ToLookUp没有GroupBy那样得延迟执行机制,它是立即执行的,且重载只有4个,而GroupBy却有8个之多。

    二、第一种用法:

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

    官方释义:根据指定的键选择器函数,从IEnumerable<TSource>创建一个 ILookup<TKey, TSource>。

    其实,ToLookUp具有GroupBy一样的分组功能,我们要LookUp的集合为source,集合内每个元素的类型为TSource,这里第一个参数keySelector的类型为Func<TSource, TKey>,用于将TSource元素按照由此委托返回的类型TKey进行LookUp,结果为一个已分好组的集合(集合中的集合)。

    编写客户端试验代码如下:

            var lookups = personList.ToLookup(p => p.Gender);
            foreach(var lookup in lookups)
            {
                Console.Write($"{lookup.Key}:	");
                foreach(var person in lookup)
                {
                    Console.Write($"{person.Name},{person.Age}	");
                }
                Console.WriteLine();
            }

    以上代码指定的KeySelector是Person类的Gender属性,因此,以上会按照Gender(性别)进行LookUp,我们使用两个嵌套的foreach循环将分组的内容打印到控制台。

    因为lookups返回的类型为ILookUp<TKey,TSource>(实际继承于IEnumerable<IGrouping<TKey,TSource>>),因此以上返回的类型为ILookUp<string,Person>。

    ILookUp<string,Person>是已经LookUp后的集合,内部集合元素为Person,且ILookUp有一个Key属性,类型为string(指的是Gender属性类型),用于LookUp的标识。

    输出结果如下:

     三、第二、三、四种用法

    由于ToLookUp与GroupBy相似,因此,第二、三、四种用法请参考请参考 [C#] LINQ之GroupBy 。

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

    官方释义:根据指定的键选择器函数和键比较器,从IEnumerable<TSource>创建一个ILookup<TKey, TElement>。

    请参考 [C#] LINQ之GroupBy 中的第二种用法。

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

    官方释义:根据指定的键选择器和元素选择器函数,从IEnumerable<TSource>创建一个ILookup<TKey, TElement>。

    请参考 [C#] LINQ之GroupBy 中的第三种用法。

    public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);

    官方释义:根据指定的键选择器函数、比较器和元素选择器函数,从IEnumerable<TSource>创建一个ILookup<TKey, TElement>。

    请参考 [C#] LINQ之GroupBy 中的第五种用法。

  • 相关阅读:
    dsp
    vector.cpp introducing the vector template.
    Bookmarks
    C#多线程参数传递.cs
    vector操作笔记
    Paragma & Bytes
    今天开博
    一台linux服务器挂载另外一台linux服务器文件系统
    nginx基于mysql的身份验证
    Ubuntu下编译nginx
  • 原文地址:https://www.cnblogs.com/cncc/p/9853726.html
Copyright © 2011-2022 走看看