通过使用默认的相等比较器生成两个序列的并集。
命名空间: System.Linq
程序集: System.Core(在 System.Core.dll 中)
语法
public static IEnumerable<TSource> Union<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second
)
类型参数
TSource
输入序列中的元素的类型。
参数
first
类型:System.Collections.Generic.IEnumerable<TSource>,一个 IEnumerable<T>,它的非重复元素构成联合的第一个集。
second
类型:System.Collections.Generic.IEnumerable<TSource>一个 IEnumerable<T>,它的非重复元素构成联合的第二个集。
返回值
类型:System.Collections.Generic.IEnumerable<TSource>一个 IEnumerable<T>,包含两个输入序列中的元素(重复元素除外)。
使用说明
在 Visual Basic 和 C# 中,可以在 IEnumerable<TSource> 类型的任何对象上将此方法作为实例方法来调用。当使用实例方法语法调用此方法时,请省略第一个参数。有关更多信息,请参见扩展方法 (Visual Basic)或扩展方法(C# 编程指南)。
异常 | 条件 |
---|---|
ArgumentNullException | first 或 second 为 null。 |
此方法通过使用延迟执行实现。 即时返回值为一个对象,该对象存储执行操作所需的所有信息。GetEnumerator方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。
此方法从结果集中排除重复项。这是与 Concat<TSource> 方法不同的行为,后者返回输入序列中的所有元素,包括重复项。
默认相等比较器 Default 用于比较实现了 IEqualityComparer<T> 泛型接口的类型的值。若要比较自定义类型,需要为该类型实现此接口并提供自己的 GetHashCode 和 Equals 方法。
当枚举此方法返回的对象时,Union 会按顺序枚举 first 和 second,并生成尚未生成的每个元素。
示例
下面的代码示例演示如何使用 Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) 获取两个整数序列的集合。
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);
}
/*
This code produces the following output:
5 3 9 7 8 6 4 1 0
*/
如果希望比较自定义数据类型的对象的序列,则必须在类中实现 IEqualityComparer<T> 泛型接口。下面的代码示例演示如何在自定义数据类型中实现此接口并提供 GetHashCode 和 Equals 方法。
public class ProductA
{
public string Name { get; set; }
public int Code { get; set; }
}
public class ProductComparer : IEqualityComparer<ProductA>
{
public bool Equals(ProductA x, ProductA y)
{
//Check whether the objects are the same object.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether the products' properties are equal.
return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);
}
public int GetHashCode(ProductA obj)
{
//Get hash code for the Name field if it is not null.
int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode();
//Get hash code for the Code field.
int hashProductCode = obj.Code.GetHashCode();
//Calculate the hash code for the product.
return hashProductName ^ hashProductCode;
}
}
实现此接口后,您可以使用的序列 ProductA 中的对象 Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) 方法,如下面的示例中所示。
ProductA[] store1 = { new ProductA { Name = "apple", Code = 9 },
new ProductA { Name = "orange", Code = 4 } };
ProductA[] store2 = { new ProductA { Name = "apple", Code = 9 },
new ProductA { Name = "lemon", Code = 12 } };
//Get the products from the both arrays
//excluding duplicates.
IEnumerable<ProductA> union = store1.Union(store2, new ProductComparer());//自定义类型时使用自己的比较方法
foreach (var product in union)
Console.WriteLine(product.Name + " " + product.Code);
/*
This code produces the following output:
apple 9
orange 4
lemon 12
*/
网友评论