首页 > 其他分享 >.NET List常见操作之交集并集差集(转)

.NET List常见操作之交集并集差集(转)

时间:2022-10-25 13:25:16浏览次数:72  
标签:Name 并集 List 差集 Add var new public

 转自:https://www.cnblogs.com/qtiger/p/13475292.html  .NET的求复杂类型集合的差集、交集、并集

一、简单类型List的交集并集差集

1、先定义两个简单类型的List

List<int> listA = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
List<int> listB = new List<int>() { 1, 2, 3, 4, 9 };

 

2、取两个List的并集

var resultUnionList= listA.Union(listB).ToList();

执行结果如下:

  

3、取两个List的交集

var resultIntersectList = listA.Intersect(listB);

执行结果如下:

  

4、取两个List的差集,差集是指取在该集合中而不在另一集合中的所有的项

var resultExceptList = listA.Except(listB);

执行结果如下:

  

二、对象List集合的交集并集差集

1、先定义一个类

    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Sex { get; set; }
    }

2、定义两个List

            //LISTA
            List<Student> stuListA = new List<Student>();
            stuListA.Add(new Student
            {
                Name = "A1",
                Age = 10,
                Sex = "男"
            });
            stuListA.Add(new Student
            {
                Name = "A2",
                Age = 11,
                Sex = "男"
            });

            //LISTB
            List<Student> stuListB = new List<Student>();
            stuListB.Add(new Student
            {
                Name = "B1",
                Age = 10,
                Sex = "女"
            });
            stuListB.Add(new Student
            {
                Name = "B2",
                Age = 11,
                Sex = "男"
            });   

 

3、取上述两个list集合的并集

var result = stuListA.Union(stuListB).ToList();

 

4、取上述两个list集合的交集,应为是对象集合,可以根据一定规则 Func<TSource, bool> predicate限定那些属于交集

(1)取两个对象集合中对象名称一样的交集

var result = stuListA.Where(x => stuListB.Any(e => e.Name == x.Name)).ToList();

  

(2)取两个对象集合中对象名称、对象年龄、对象性别都一样的交集

var result = stuListA.Where(x => stuListB.Any(e => e.Name == x.Name && e.Age == x.Age && e.Sex == x.Sex)).ToList();

 

5、取上述两个list集合的差集,可以根据一定规则 Func<TSource, bool> predicate限定那些属于差集

(1)取差集,根据两个对象集合中对象名称一样的规则取差集

var result = stuListA.Where(x =>! stuListB.Any(e => e.Name == x.Name)).ToList();

  

(2)取差集,根据两个对象集合中对象名称、对象年龄、对象性别都一样的规则取差集

var result = stuListA.Where(x => !stuListB.Any(e => e.Name == x.Name && e.Age == x.Age && e.Sex == x.Sex)).ToList();

三、List<string>和List<int>互相转换

List<string> 转 List<int>

var list = (new[]{"1","2","3"}).ToList();
var newlist = list.Select<string,int>(x =>Convert.ToInt32(x));

List<int> 转List<string> 

List<int> list = new List<int>(new int[] { 1,2,3 } );
List<string> newList = list.ConvertAll<string>(x => x.ToString());

四、List排重

1、使用linq提供的Distinct方法

public class Test
{ 
     public int ID { get; set; }
     public string Name { get; set; }
}
public class TestMain
{
  public static void TestMothod()
  {
     List<Test> testList = new List<Test>();
      testList.Add(new Test { ID = 1, Name = "小名" });
      testList.Add(new Test { ID = 1, Name = "小红" });
      testList.Add(new Test { ID = 2, Name = "小名" });
      //通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。
      List<Test> tempList = testList.Distinct<Test>().ToList();
   }
}

2、根据某个字段排除重复项

添加一个扩展排重扩展方法:

 public static class DistinctExtension
 {
    public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, System.Func<TSource, TKey> keySelector)
    {
        HashSet<TKey> seenKeys = new HashSet<TKey>();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
 }

使用上述扩展方法:

public class TestMain
{
  public static void TestMothod()
   {
       List<Test> testList = new List<Test>();
       testList.Add(new Test { ID = 1, Name = "小名" });
       testList.Add(new Test { ID = 1, Name = "小红" });
       testList.Add(new Test { ID = 2, Name = "小名" });
       //根据某个字段排除重复项。
       List<Test> tempList = testList.DistinctBy(p => p.ID).ToList();
   }
}
 

标签:Name,并集,List,差集,Add,var,new,public
From: https://www.cnblogs.com/microsoft-xin/p/16824538.html

相关文章

  • 获取DataTable里的多列生成新的DataTable,获取List集合里的一列生成新的List
    List<Ba_Material>allBa_material=newList<Ba_Material>();//所有物料信息DataTabledatSource=_bll.getMaterialDatatable(model);//所有......
  • LinkedList遍历
    publicstaticvoidmain(String[]args){LinkedList<Integer>list=newLinkedList<>();list.add(1);list.add(2);list.add(3);......
  • zbx_tcp_listen() fatal error:unable to serve on any address [[-]:10070]
    Zabbix服务器未启动侦听器失败:zbx_tcp_listen()致命错误:无法在任何地址上提供服务[[-]:10070]日志错误:服务状态以及尝试启动时:进程正在运行:但是服务仍然停止: ......
  • Cannot create graph: graph with the same name "PORT_LISTEN_STATUS" already exist
    解决办法,后面加上{#TCP_PORT}:......
  • 5.List源码面试题集锦
    1.新建一个ArrayList,现在add一个值,此时数组的大小是多少?下一次扩容前最大可用大小是多少?答:此处数组的大小是1,下一次扩容前最大可用大小是10。因为ArrayList无参构造器初始......
  • 4.LinkedList源码解析
    1.数据结构LinkedList底层数据结构是一个双向链表,整体结构如上图所示,链表中的每个节点都可以向前或者向后追溯。源码privatestaticclassNode<E>{//节点值Eite......
  • 3.ArrayList源码解析
    1.数据结构ArrayList的数据结构是一个数组,如上图所示,图中展示的是一个长度为10的数组,从1开始计数,index表示数组的下标,从0开始计数,elementData表示数组元素。除此之外,源码中......
  • 2.4 RedisAPI之list
    1.简介字符串键值结构(keyvalue)特点有序可重复左右两边都可插入和删除2.命令从列表右端插入值rpushkeyvalue1value2......valueN时间复杂度为O(1~n)从列表左端插入值l......
  • [HTML 5] HTML List
    <!--normallist--><ul><li>Here'sathing</li><li>Anotherthing</li><li>Morethings</li><li><ahref="#">Alinkinathing</a></li></ul><!--or......
  • List接口的常用方法和遍历方式
    packagecom.msb.test01;importjava.util.ArrayList;importjava.util.Iterator;/***@author:liu*日期:16:47:13*描述:IntelliJIDEA*版本:1.0*/p......