Enumerable.Union<TSource> 方法
功能:生成两个序列的并集(使用默认的相等比较器)。
命名空间: System.Linq
程序集: System.Core.dll
备注:实现此方法时使用了延迟执行。 它直接返回一个对象,该对象存储了执行操作所需的所有信息。 此方法所表示的查询不会被执行,直到调用了 GetEnumerator 方法或通过使用了 Visual C# 中的 foreach 或 Visual Basic 中的 For Each。
此方法从结果集中排除重复项。 这和 Concat<TSource> 方法(它的功能是连接两个序列)不同,后者返回输入序列中的所有元素包括重复项。
默认的相等比较器,Default ,用于比较的类型的值,它实现了 IEqualityComparer<T> 泛型接口。 若自定义数据类型比较器,您需要实现此接口,并提供您自己的 GetHashCode 和 Equals 方法。
当此方法返回的对象是枚举对象时, Union<TSource> 枚举 first 和 second 中的对象并按此顺序来生成尚未生成的每个元素。
示例:
下面的代码示例演示如何使用 Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) 以获取两个整数的序列的并集。
using System; using System.Collections.Generic; using System.Linq; public class Test { static void Main() { 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); } /* 程序运行结果: 5 3 9 7 8 6 4 1 0 */ } }
如果您想要自定义数据比较器,则必须实现 IEqualityComparer<T> 泛型接口。下面的代码演示如何实现此接口,并提供对 GetHashCode 和 Equals 方法的实现。
using System; using System.Collections.Generic; using System.Linq; public class ProductA { public string Name { get; set; } public int Code { get; set; } public virtual bool MyEquals(Object obj) { return true; } } public class ProductComparer : IEqualityComparer<ProductA> { public bool Equals(ProductA x, ProductA y) { //检查比较的对象的引用是否一样 if (Object.ReferenceEquals(x, y)) return true; //检查product对象的属性的值是否相等 return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name); } public int GetHashCode(ProductA obj) { //如果Name字段不为空,就获取它的哈希编码 int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode(); //获取Code字段的哈希编码 int hashProductCode = obj.Code.GetHashCode(); //计算product对象的哈希编码 return hashProductName ^ hashProductCode; } } public class Test { static void Main() { 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 } }; // 从上面两个数组中获取products,并排除相同的项,
// 这里使用了自定义的比较器:ProductComparer IEnumerable<ProductA> union = store1.Union(store2, new ProductComparer()); foreach (var product in union) Console.WriteLine(product.Name + " " + product.Code); /* 程序运行结果: apple 9 orange 4 lemon 12 */ } }
参考资料:https://msdn.microsoft.com/zh-cn/library/bb341731(v=vs.110).aspx
posted on 2017-02-14 16:00 wangzhiliang 阅读(549) 评论(0) 编辑 收藏 举报