C# 对List<T>取交集、连集及差集

※本文使用int為例,若為使用自訂之DataModel,需實作IEquatable<T>介面才能使用

1.  取交集 (A和B都有)

List A : { 1 , 2 , 3 , 5 , 9 }

List B : { 4 , 3 , 9 }

1 var intersectedList = list1.Intersect(list2);

結果 : { 3 , 9 }

判斷A和B是否有交集

1 bool isIntersected = list1.Intersect(list2).Count() > 0

2. 取差集 (A有,B沒有)

List A : { 1 , 2 , 3 , 5 , 9 }

List B : { 4 , 3 , 9 }

1 var expectedList = list1.Except(list2);

結果 : { 1 , 2 , 5 }

判斷A和B是否有差集

1 bool isExpected = list1.Expect(list2).Count() > 0

3.  取聯集 (包含A和B)

List A : { 1 , 2 , 3 , 5 , 9 }

List B : { 4 , 3 , 9 }

01 public static class ListExtensions
02 {
03     public static List<T> Merge<T>(this List<T> source, List<T> target)
04     {
05         List<T> mergedList = new List<T>(source);
06  
07         mergedList.AddRange(target.Except(source));
08  
09         return mergedList;
10     }   
11 }
1 var mergedList = list1.Merge(list2);

結果 : { 1 , 2 , 3 , 5 ,9 , 4 }

※ 6/15補充:感謝蹂躪大大提醒,LinQ已有內建方法Union可取聯集囉!

結語

使用Linq就可以輕鬆完成List的比對,

如果有任何問題歡迎大家一起討論囉 :)

转载于:http://www.cnblogs.com/liguanghui/archive/2011/11/09/2242309.html

在开发过程中.数组和集合的处理是最让我们担心.一般会用for or foreach 来处理一些操作.这里介绍一些常用的集合跟数组的操作函数.

首先举例2个集合A,B.

List<int> listA = new List<int> {1,2,3,5,7,9};

List<int> listB = new List<int> {13,4,17,29,2};

listA.AddRange(listB );把集合A.B合并

List<int> Result = listA.Union(listB).ToList<int>();          //剔除重复项

List<int> Result = listA.Concat(listB).ToList<int>();        //保留重复项

listA.BinarySearch("1");//判断集合中是否包含某个值.如果包含则返回0

在举例两个数组

int[] i=new int[]{1,2};

int[] j=new int[]{2,3};

List<int> r = new List<int>();

r.AddRange(i);

r.AddRange(j);

int[] c = r.ToArray(); 合并数组

int[] x=i.Union(j).ToArray<int>(); //剔除重复项

int[] x=i.Concat(j).ToArray<int>(); //保留重复项

int n = Array.BinarySearch(i,3);//判断数组中是否包含某个值.如果包含则返回0

时间: 2024-11-05 15:59:38

C# 对List<T>取交集、连集及差集的相关文章

两个list取交集、并集、差集

1.交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] #方法二 print list(set(a).intersection(set(b))) 2.并集 print list(set(a).union(set(b))) 3.差集 print list(set(b).difference(set(a))) # b中有而a中没有的

java判断两集合是否相同以及求取交集,并集,差集

业务中用时需要判断两集合是否相同,所有提供一个工具方法,使用set集合的特性(元素唯一): private Map<String,Set<Integer>> getCategoryApiId(Set<Integer> oldAuthSet , Set<Integer> newAuthSet){ Map<String,Set<Integer>> categoryApiId = new HashMap(); if (oldAuthSet!

List&lt;T&gt;取交集、差集、并集

1.  取交集 (A和B都有) List A : { 1 , 2 , 3 , 5 , 9 }List B : { 4 , 3 , 9 }var intersectedList = list1.Intersect(list2);结果 : { 3 , 9 }判断A和B是否有交集 bool isIntersected = list1.Intersect(list2).Count() > 0 2. 取差集 (A有,B沒有)List A : { 1 , 2 , 3 , 5 , 9 }List B : {

两个数组取交集的算法

在Lucene中,如果用户的查询向量Term t = {xx,xx,……},BooleanQuery为AND时,每个t---->对应得到的倒排列表,倒排列表由许多的倒排索引项构成,然后取其中重复的文档编号,然后进行排序.器核心思想类似于如下问题: 现有两个数组:int []data1 = {12,45,65,2,5} int []data2 = {12,5,-8,9},取其中的交集. 实现的方案有很多,现在采取一种时间和空间相对较好的算法:集合压缩算法,即:1.分别计算两个数组的min和max(

sql server中取交集、差集和并集的语法

这里简单总结下在SQL Server中取交集.差集和并集的语法. 交集:INTERSECT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 INTERSECT SELECT ID, NAME FROM YANGGB2 差集:EXCEPT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 EXCEPT SELECT ID, NAME FROM YANGGB2 并集:UNION或UNION ALL(适用于两个结果集) -- 不包括重复行,进行

oracle中取交集、差集和并集的语法

这里简单总结下在Oracle中取交集.差集和并集的语法. 交集:INTERSECT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 INTERSECT SELECT ID, NAME FROM YANGGB2 差集:MINUS(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 MINUS SELECT ID, NAME FROM YANGGB2 并集:UNION或UNION ALL(适用于两个结果集) -- 不包括重复行,进行默认排序 S

java 取交集方法retainAll

java 取交集方法retainAll 有两个集合newCoures和oldCourses,判断这两个集合是否包含相同的对象或元素, 可以使用retainAll方法:oldCourses.retainAll(newCoures). 如果存在相同元素,oldCourses中仅保留相同的元素. 如果不存在相同元素,oldCourse会变为空. 如果有多个集合oldCourses1.oldCourses2.oldCourses3等,分别与newCourses比较,应该将newCourses统一放在后面

Oracle-27-集合操作(交集、并集、差集)&amp;子查询之单行子查询

一.集合操作 1.UNION:并集运算. 语法结构: SQL>select 表1的列1, 表1的列2 from 表1 union select表2的列1, 表2的列2 from表2; 其中表1的列1和表1的列2是来自于表1的两列,表2的列1和表2的列2是来自于表2的两列,需要注意的是,如果union前面是n列,那么后面也必须是n列,即union前后列数必须相同.而且查询结果的列名是按照union前面n列的名称命名(如例1). 2.INTERSECT:交集运算. 语法结构: SQL>select

用Linq取两个数组的差集

两个数组,取其差集,用Linq做比较方便,效率也比较高,具体如下示例 有两个数组list1 和list2 ,如下 List<int> list1 = new List<int>(); list1.Add(1); list1.Add(2); list1.Add(3); List<int> list2 = new List<int>();list2.Add(1); list2.Add(2); list2.Add(3); list2.Add(4); list2.A