zoukankan      html  css  js  c++  java
  • LINQ函数

    LINQ函数虽然和LINQ语句实现了同样的功能,但LINQ函数使用起来更加快捷。学过数据库的感觉LINQ语句都不难,但语句比较长。

    会LINQ函数,才算会LINQ。

    1、Where(),结果过滤

    1 List<int> list = new List<int>() {1,2,3,4,5,6,7,8,9,10 };
    2             IEnumerable<int> newList =  list.Where(a => a >= 3);
    3             //查找大于3的数
    4             //输出
    5             foreach (var item in newList)
    6             {
    7                 Console.WriteLine(item);
    8             }

    结果:

    3
    4
    5
    6
    7
    8
    9
    10

    2、Select()

    Select()处理结果会传回一个对象,这个对象可以是现在对象 ,也可以是匿名类型。

    在LINQ语句 中的select new语句 ,会自动被编译器转换为Select().

    有如下代码:

    1 List<int> list = new List<int>() {1,2,3,4,5,6,7,8,9,10 };
    2 var Num = from aa in list
    3                          where aa == 1
    4                          select new
    5                              {
    6                                  Number = aa,                                
    7                              };
    8             Console.WriteLine(Num.FirstOrDefault().Number);
    1 var SelectNum = list.Where(x => x == 1).Select(x => new
    2             {
    3                 Number = x
    4             });

    上面两段代码其实是一样的。

     3、SelectMany()

    SelectMany()类似于数据库中的CrossJoin

    1 List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6 };
    2 List<int> list2 = new List<int>() { 6, 4, 2, 7, 9, 0 };
    1 var query = list1.SelectMany(x => list2);
    2             foreach (var item in query)
    3             {
    4                 Console.WriteLine(item);
    5             }

    运行结果就是将list2输出6次

    下面来看看MSDN上面的代码

    class PetOwner
            {
                public string Name { get; set; }
                public List<String> Pets { get; set; }
            }
    
    public static void SelectManyEx1()
            {
                PetOwner[] petOwners = 
                        { new PetOwner { Name="Higa, Sidney", 
                              Pets = new List<string>{ "Scruffy", "Sam" } },
                          new PetOwner { Name="Ashkenazi, Ronen", 
                              Pets = new List<string>{ "Walker", "Sugar" } },
                          new PetOwner { Name="Price, Vernette", 
                              Pets = new List<string>{ "Scratches", "Diesel" } } };
    
                // Query using SelectMany().
                IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);
    
                Console.WriteLine("Using SelectMany():");
    
                // Only one foreach loop is required to iterate 
                // through the results since it is a
                // one-dimensional collection.
                foreach (string pet in query1)
                {
                    Console.WriteLine(pet);
                }      
            }

    运行结果:

    Using SelectMany():
    Scruffy
    Sam
    Walker
    Sugar
    Scratches
    Diesel

    这里其实很好理解 。就是1对2,输出2.

    4、GroupBy()

    GroupBy()会按照给定的key(keySelector)以及内容elementSelector,产生群组后的结果

    GroupBy()设置了使用数列本身作为Key值,并且利用这个Key分组产生分组的数据。

    1 List<int> list = new List<int>() { 1, 2, 3, 4, 5, 1, 5 };
    2 
    3             var query = list.GroupBy(x => x);
    4 
    5             foreach (var item in query)
    6             {
    7                 Console.WriteLine("NUMBER:{0}  COUNT{1}",item.Key,item.Count());
    8             }

    运行结果:

    NUMBER:1 COUNT2
    NUMBER:2 COUNT1
    NUMBER:3 COUNT1
    NUMBER:4 COUNT1
    NUMBER:5 COUNT2

    1 foreach (var item in query)
    2             {
    3                 for (int i = 0; i < item.Count(); i++)
    4                 {
    5                     Console.WriteLine(item.ElementAt(i));
    6                 }
    7                 Console.WriteLine("=======================");
    8             }

    运行结果:

    1
    1
    =======================
    2
    =======================
    3
    =======================
    4
    =======================
    5
    5
    =======================

     5、ToLookUp()

    从 IEnumerable<T> 生成一个泛型 Lookup<TKey, TElement>。

    ToLookUp()看起来和GroupBy()有些类似,但是它会另外生成一个新的集合对象,这个集合对象由ILookup<TKey,TElement>组成

     1 var Marks = new[]
     2             {
     3                 new {Mark = 90,Group = "A"},
     4                 new {Mark = 80,Group = "B"},
     5                 new {Mark = 70,Group = "C"},
     6                 new {Mark = 60,Group = "D"}
     7             };
     8 
     9             var lookUpValue = Marks.ToLookup(x => x.Group);
    10 
    11             foreach (var item in lookUpValue)
    12             {
    13                 Console.WriteLine("========Group:{0}=============",item.Key);
    14                 foreach (var result in item)
    15                 {
    16                     Console.WriteLine(result.Group + "  " + result.Mark);
    17                 }
    18             }

    运行结果

    ========Group:A=============
    A 90
    ========Group:B=============
    B 80
    ========Group:C=============
    C 70
    ========Group:D=============
    D 60

    另一段测试代码:

     1  var MarksWithName = new[] 
     2             {
     3                 new {Mark = 90,Name="Jack",Group="A"},
     4                 new {Mark = 80,Name="Jany",Group="B"},
     5                 new {Mark = 70,Name = "Tom",Group="C"}
     6             };
     7 
     8             var lookUpValue2 = MarksWithName.ToLookup(x => x.Group);
     9             foreach (var item in lookUpValue2)
    10             {
    11                 Console.WriteLine("============Group:{0}==============",item.Key);
    12                 foreach (var result in item)
    13                 {
    14                     Console.WriteLine("Name:{0} Mark:{1}",result.Name,result.Mark);
    15                 }
    16             }

    运行结果:

    ============Group:A==============
    Name:Jack Mark:90
    ============Group:B==============
    Name:Jany Mark:80
    ============Group:C==============

    6、Join

    将两个集合进行联接,即数据库中的Inner Join

     1 var Mark = new[]
     2             {
     3                 new {Name = "C",Mark = 65},
     4                 new {Name = "A",Mark = 70},
     5                 new {Name = "B", Mark = 80}
     6                 
     7             };
     8 
     9             var Age = new[]
    10             {              
    11                 new {Name = "B",Age = 18},
    12                 new {Name = "C",Age = 17},
    13                 new {Name = "A",Age = 20}
    14             };
    //LINQ语句
                var query = from mk in Mark
                            join ae in Age on mk.Name equals ae.Name
                            select
                            new
                            {
                                Name = mk.Name,
                                Mark = mk.Mark,
                                Age = ae.Age
                            };
    
                //输出
                foreach (var item in query)
                {
                    Console.WriteLine("姓名{0} 成绩{1} 年龄{2}",item.Name,item.Mark,item.Age);
                }
    1 //LINQ函数
    2            
    3             var query2 = Mark.Join(Age, mk => mk.Name, ae => ae.Name, (mk, ae) => new { Name = mk.Name,Mark = mk.Mark,Age = ae.Age });
    4 
    5             foreach (var item in query2)
    6             {
    7                 Console.WriteLine("姓名{0} 成绩{1} 年龄{2}", item.Name, item.Mark, item.Age);
    8             }

    上面两段代码输出的结果都是:

    姓名C 成绩65 年龄17
    姓名A 成绩70 年龄20
    姓名B 成绩80 年龄18

     7、GroupJoin

    将两个集合进行联接,并对结果进行分组。下面的例子就是以国家名字为组,显示其对应的省份信息。

     1    class Country
     2     {
     3         public string CountryName { get; set; }    
     4     }
     5 
     6     class Province
     7     {
     8         public Country OwnerCountry { get; set; }
     9         public string ProvinceName { get; set; }
    10         public string ProvinceSize { get; set; }
    11         public string ProvinceSpot { get; set; }
    12     }
     1             Country c1 = new Country()
     2             {
     3                 CountryName = "China"
     4             };
     5 
     6             Country c2 = new Country()
     7             {
     8                 CountryName = "America"
     9             };
    10 
    11             Country c3 = new Country()
    12             {
    13                 CountryName = "Korea"
    14             };
    15 
    16             Country c4 = new Country()
    17             {
    18                 CountryName = "Russian"
    19             };
    20 
    21 
    22             Province p1 = new Province()
    23             {
    24                 ProvinceName = "Hunan",
    25                 ProvinceSize = "200",
    26                 ProvinceSpot = "Old City",
    27                 OwnerCountry = c1
    28             };
    29 
    30             Province p2 = new Province()
    31             {
    32                 ProvinceName = "Chicago",
    33                 ProvinceSize = "150",
    34                 ProvinceSpot = "Linkin Park",
    35                 OwnerCountry = c2
    36             };
    37 
    38             Province p3 = new Province()
    39             {
    40                 ProvinceName = "Seoul",
    41                 ProvinceSize = "100",
    42                 ProvinceSpot = "Tian Tian World",
    43                 OwnerCountry = c3,
    44             };
    45 
    46             Province p4 = new Province()
    47             {
    48                 ProvinceName = "Hunan",
    49                 ProvinceSize = "200",
    50                 ProvinceSpot = "Tian Meng Mountain",
    51                 OwnerCountry = c1
    52             };
    53 
    54             Province p5 = new Province()
    55             {
    56                 ProvinceName = "Moscow",
    57                 ProvinceSize = "80",
    58                 ProvinceSpot = "Moscow University",
    59                 OwnerCountry = c4
    60             };
    61 
    62             Province p6 = new Province()
    63             {
    64                 ProvinceName = "Moscow",
    65                 ProvinceSize = "80",
    66                 ProvinceSpot = "HelloWorld",
    67                 OwnerCountry = c4
    68             };

    声明4个Country类和6个Province类,并放入countries和provinces集合

    1             List<Province> provinces = new List<Province>()
    2             {
    3                 p1,p2,p3,p4,p5,p6
    4             };
    5 
    6             List<Country> countries = new List<Country>()
    7             {
    8                  c1,c2,c3,c4
    9             };

    先来看看Join的结果 

     1  var joinResult = countries.Join(provinces,
     2                                             country => country,
     3                                             province => province.OwnerCountry,
     4                                             (country, province) =>
     5                                             new
     6                                             {
     7                                                 CountryName = country.CountryName,
     8                                                 ProvinceName = province.ProvinceName,
     9                                                 Size = province.ProvinceSize,
    10                                                 Spot = province.ProvinceSpot,
    11                                             });
    12             Console.WriteLine("--------------------------------");
    13             foreach (var item in joinResult)
    14             {
    15                 Console.WriteLine(item.CountryName + "  " + item.ProvinceName + "  " + item.Size + "  " + item.Spot);
    16             }

    运行结果:

    --------------------------------
    China Hunan 200 Old City
    China Hunan 200 Tian Meng Mountain
    America Chicago 150 Linkin Park
    Korea Seoul 100 Tian Tian World
    Russian Moscow 80 Moscow University
    Russian Moscow 80 HelloWorld
    --------------------------------

    再看看GroupJoin的结果 

     1   var groupJoinResult = countries.GroupJoin(provinces,
     2                                                       country=>country,
     3                                                       province=>province.OwnerCountry,
     4                                                       (country,province)=>
     5                                                       new
     6                                                       {
     7                                                           Name = country.CountryName,
     8                                                           ProvinceSet = province.Select(x=>x)
     9                                                       });
    10             foreach (var item in groupJoinResult)
    11             {
    12                 Console.WriteLine("******************");
    13                 Console.WriteLine(item.Name);
    14                 foreach (var p in item.ProvinceSet)
    15                 {
    16                     Console.WriteLine(p.ProvinceName + "  " + p.ProvinceSize + "  " + p.ProvinceSpot);
    17                 }
    18             }

    运行结果:

    ******************
    China
    Hunan 200 Old City
    Hunan 200 Tian Meng Mountain
    ******************
    America
    Chicago 150 Linkin Park
    ******************
    Korea
    Seoul 100 Tian Tian World
    ******************
    Russian
    Moscow 80 Moscow University
    Moscow 80 HelloWorld

     8、Distinct

    去除集合中的重复结果

    值类型

    1 class Program
    2     {
    3         static void Main(string[] args)
    4         {
    5             List<int> valueList = new List<int>() { 1, 1, 2, 2, 3, 3, 4, 4, };
    6             var distinctValueList = valueList.Distinct().ToList();
    7             distinctValueList.ForEach(x => Console.WriteLine(x));
    8         }
    9     }

    运行结果

    1
    2
    3
    4

    引用类型

     1 public class PrintImage
     2     {
     3         public  int ImageKey { get; set; }
     4 
     5         public string ImagePath { get; set; }
     6     }
     7 
     8     //定义方法以支持对象的相等比较。
     9     //https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.iequalitycomparer-1?redirectedfrom=MSDN&view=netframework-4.8
    10     class PrintImageEqualityComparer : IEqualityComparer<PrintImage>
    11     {
    12         public bool Equals(PrintImage p1, PrintImage p2)
    13         {
    14             if (p1 == null && p2 == null)
    15                 return true;
    16             else if (p1 == null || p2 == null)
    17                 return false;
    18             else if (p1.ImageKey == p2.ImageKey)
    19                 return true;
    20             else
    21                 return false;
    22         }
    23 
    24         public int GetHashCode(PrintImage pImage)
    25         {
    26             return pImage.ImageKey.GetHashCode();
    27         }
    28     }
    29 
    30     class Program
    31     {
    32         static void Main(string[] args)
    33         {           
    34             List<PrintImage> objList = new List<PrintImage>()
    35             {
    36                 new PrintImage()
    37                 {
    38                     ImageKey = 1,
    39                     ImagePath = "D:\crawler\image1"
    40                 },
    41                 new PrintImage()
    42                 {
    43                     ImageKey = 1,
    44                     ImagePath = "D:\crawler\image2"
    45                 },
    46                 new PrintImage()
    47                 {
    48                     ImageKey = 2,
    49                     ImagePath = "D:\crawler\image3"
    50                 },
    51                 new PrintImage()
    52                 {
    53                     ImageKey = 3,
    54                     ImagePath = "D:\crawler\image4"
    55                 }
    56             };
    57 
    58             //使用实现了IEqualityComparer<T>的PrintImageEqualityComparer类对PrintImage对象进行比较
    59             //通过使用Distincet去除了集合中的第二个对象
    60             var distinctObjList = objList.Distinct(new PrintImageEqualityComparer()).ToList();
    61             distinctObjList.ForEach(x => { Console.WriteLine(x.ImageKey); Console.WriteLine(x.ImagePath); });
    62         }
    63     }

    运行结果:

    1
    D:crawlerimage1
    2
    D:crawlerimage3
    3
    D:crawlerimage4

  • 相关阅读:
    centos7安装YouCompleteMe,vim打造成C++的IDE
    java循环定时器@Scheduled的使用
    js使用“toFixed( )”保留小数点后两位
    linux小本
    解决Maven资源过滤问题
    在Maven普通项目上添加Web app的支持
    项目中添加lib依赖
    回顾Servlet
    Tomcat 中文乱码
    Initialization failed for 'https://start.spring.io' Please check URL
  • 原文地址:https://www.cnblogs.com/zhaotianff/p/6236062.html
Copyright © 2011-2022 走看看