LINQ 中的集合操作

集合操作有四个运算符,每个运算符根据不同的条件产生结果。

运算符 描述 C# 查询表达式语法 VB 查询表达式语法
Distinct 通过过滤重复数据(如果有)从集合中得出唯一值列表 不适用 Distinct
Except 比较值两个集合并返回一个集合中不在另一个集合中的值 不适用 不适用
相交 返回在两个单独的集合中发现相同的值集 不适用 不适用
联合 将两个不同集合的内容合并为一个列表,并且没有任何重复内容 不适用 不适用

Distinct 示例 - 查询表达式

VB

Module Module1

   Sub Main()
  
      Dim classGrades = New System.Collections.Generic.List(Of Integer) From {63, 68, 71, 75, 68, 92, 75}

      Dim distinctQuery = From grade In classGrades 
                          Select grade Distinct

      Dim sb As New System.Text.StringBuilder("The distinct grades are: ")
	  
      For Each number As Integer In distinctQuery
         sb.Append(number & " ")
      Next

      MsgBox(sb.ToString())
	  
   End Sub
   
End Module

当上述代码被编译并执行时,它会产生以下结果 −

The distinct grades are: 63 68 71 75 92

Except 示例 - Enumerable.Except 方法

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class Program {
      static void Main(string[] args) {
      
         double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
         double[] numbers2 = { 2.2 };

         IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

         foreach (double number in onlyInFirstSet)
            Console.WriteLine(number);
            Console.ReadLine();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim numbers1() As Double = {2.0, 2.1, 2.2, 2.3, 2.4, 2.5}
      Dim numbers2() As Double = {2.2}

      Dim onlyInFirstSet As IEnumerable(Of Double) = numbers1.Except(numbers2)

      Dim output As New System.Text.StringBuilder
	  
      For Each number As Double In onlyInFirstSet
         output.AppendLine(number)
         Console.WriteLine(number)
      Next
	  
      Console.ReadLine()
     
   End Sub
   
End Module

当编译并执行上述 C# 或 VB 代码时,会产生以下结果 −

2
2.1
2.3
2.4
2.5

Intersect 示例 - Enumerable.Intersect 方法

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class Program {
      static void Main(string[] args) {

         int[] id1 = { 44, 26, 92, 30, 71, 38 };
         int[] id2 = { 39, 59, 83, 47, 26, 4, 30 };

         IEnumerable<int> both = id1.Intersect(id2);

         foreach (int id in both)
            Console.WriteLine(id);
            Console.ReadLine();
      }
   }
}	

VB

Module Module1

   Sub Main()
   
      Dim id1() As Integer = {44, 26, 92, 30, 71, 38}
      Dim id2() As Integer = {39, 59, 83, 47, 26, 4, 30}

      Dim intersection As IEnumerable(Of Integer) = id1.Intersect(id2)

      Dim output As New System.Text.StringBuilder
	  
      For Each id As Integer In intersection
         output.AppendLine(id)
         Console.WriteLine(id)
      Next
     
      Console.ReadLine()
     
   End Sub
   
End Module

当编译并执行上述 C# 或 VB 代码时,会产生以下结果 −

26
30

Union 示例 - Enumerable.Union 方法

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class Program {
      static void Main(string[] args) {
      
         int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
         int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

         IEnumerable<int> union = ints1.Union(ints2);

         foreach (int num in union) {
            Console.Write("{0} ", num);
            Console.Write("
");
         }
			
         Console.ReadLine();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim ints1() As Integer = {5, 3, 9, 7, 5, 9, 3, 7}
      Dim ints2() As Integer = {8, 3, 6, 4, 4, 9, 1, 0}

      Dim union As IEnumerable(Of Integer) = ints1.Union(ints2)

      Dim output As New System.Text.StringBuilder
	  
      For Each num As Integer In union
         output.AppendLine(num & " ")
         Console.WriteLine(num & " ")
      Next
     
      Console.ReadLine()
	  
   End Sub
   
End Module

当编译并执行上述 C# 或 VB 代码时,会产生以下结果 −

5
3 
9 
7 
8 
6 
4 
1 
0

linq_query_operators.html