明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1277, 文章 - 0, 评论 - 214, 阅读 - 320万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

C# Linq 交集、并集、差集、去重

Posted on   且行且思  阅读(7328)  评论(0编辑  收藏  举报

其实只要明白 LINQ查询操作符的

Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefault、Reverse、SelectMany,Aggregate()(这个挺偏的,具体意思有空再写,可以百度一下)

的使用,一些简单的操作就可以了。
合并两个数组,并去掉重复元素,然后排序(C#)

 List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 12, 10 };
            List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };
            var newQuerty = numbers1.Concat(
            from n in numbers2
            where !numbers1.Contains(n)
            select n
            ).OrderBy(n => n);
            string count = "";
            foreach (int i in newQuerty)
            {
                count += i + ",";
            }
            MessageBox.Show(count);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这简单的介绍几个关键字,Distinct、Union、Concat、Intersect、Except、Skip、Take
Distinct - 过滤集合中的相同项;

   List<int> list= new List<int>() {1,2,3,4,4,5,6,6 };
  var newlist=list.Distinct();
  • 1
  • 2

得到的结果就是;1,2,3,4,5,6

Union - 连接不同集合,自动过滤相同项

 List<int> list= new List<int>() {1,2,3,4,4,5,6,6 };
List<int> list1= new List<int>() {5,6,6,7,8,9};
  var newlist=list.Union (list1);
  • 1
  • 2
  • 3

得到的结果就是;1,2,3,4,5,6,7,8,9

Concat - 连接不同集合,不会自动过滤相同项;

 List<int> list= new List<int>() {1,2,3,4,4,5,6,6 };
List<int> list1= new List<int>() {5,6,6,7,8,9};
  var newlist=list.Union (list1);
  • 1
  • 2
  • 3

得到的结果就是;1,2,3,4,4,5,6,6,5,6,6,7,8,9

Intersect - 获取不同集合的相同项(交集);

List<int> list= new List<int>() {1,2,3,4,4,5,6,6 };
List<int> list1= new List<int>() {5,6,6,7,8,9};
  var newlist=list.Intersect (list1);
  • 1
  • 2
  • 3

得到的结果就是;5,6

Except - 从某集合中删除其与另一个集合中相同的项;其实这个说简单点就是某集合中独有的元素

List<int> list= new List<int>() {1,2,3,4,4,5,6,6 };
List<int> list1= new List<int>() {5,6,6,7,8,9};
  var newlist=list.Except (list1);
  • 1
  • 2
  • 3

得到的结果就是;1,2,3,4

Skip - 跳过集合的前n个元素;

List<int> list= new List<int>() {1,2,3,4,4,5,6,6 };
  var newlist=list.Skip (3);
  • 1
  • 2

得到的结果就是;4,4,5,6,6

Take - 获取集合的前n个元素;延迟

List<int> list= new List<int>() {1,2,2,3,4,4,5,6,6 };
  var newlist=list.Take (3);
  • 1
  • 2

得到的结果就是;1,2,2

List<string> ListA = new List<string>();
List<string> ListB = new List<string>();
List<string> ListResult = new List<string>();

ListResult = ListA.Distinct().ToList();//去重
ListResult = ListA.Except(ListB).ToList();//差集
ListResult= ListA.Union(ListB).ToList();  //并集
ListResult = ListA.Intersect(ListB).ToList();//交集
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

重写比较方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data; 
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            IList<Student> oneStudents = new List<Student>();
            oneStudents.Add(new Student(1,false,"小新1","徐汇"));
            oneStudents.Add(new Student(2,false,"小新2","闵行"));
            oneStudents.Add(new Student(3, false, "小新3", "嘉定"));
            oneStudents.Add(new Student(4, false, "小新4", "闸北"));

            IList<Student> twoStudents = new List<Student>();
            twoStudents.Add(new Student(5, false, "小新5", "贵州"));
            twoStudents.Add(new Student(6, false, "小新6", "湖北"));
            twoStudents.Add(new Student(7, false, "小新7", "山东"));
            twoStudents.Add(new Student(8, false, "小新8", "西藏"));

            IList<Student> threeStudents = new List<Student>();
            threeStudents.Add(new Student(1, false, "小新1", "徐汇"));
            threeStudents.Add(new Student(2, false, "小新2", "闵行"));
            var bingji = oneStudents.Union(twoStudents, new StudentListEquality()).ToList();//并(全)集 
              var jiaoji = oneStudents.Intersect(threeStudents, new StudentListEquality()).ToList();//交集 
              var chaji = oneStudents.Except(threeStudents, new StudentListEquality()).ToList();//差集

              Console.WriteLine();
            Console.WriteLine("以下是并集的结果");            
            bingji.ForEach(x =>
            {
                Console.WriteLine(x.StudentId.ToString() + "    " + x.Sex.ToString() + "   " + x.Name.ToString()+" "+x.Address.ToString());

            });
            Console.WriteLine();
            Console.WriteLine("以下是交集的结果");           
            jiaoji.ForEach(x =>
            {
                Console.WriteLine(x.StudentId.ToString() + "    " + x.Sex.ToString() + "   " + x.Name.ToString() + " " + x.Address.ToString());

            });

            Console.WriteLine();
            Console.WriteLine("以下是差集的结果");            
            chaji.ForEach(x =>
            {
                Console.WriteLine(x.StudentId.ToString() + "    " + x.Sex.ToString() + "   " + x.Name.ToString() + " " + x.Address.ToString());

            });
        }

    }
    public class Student
    {
        public Student(int studentId, bool sex, String name, String address)
        {
            this.StudentId = studentId;
            this.Sex = sex;
            this.Name = name;
            this.Address = address;
        }
        public int StudentId { get; set; }
        public bool Sex { get; set; }
        public String Name { get; set; }
        public String Address { get; set; }

    }
    public class StudentListEquality : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            return x.StudentId == y.StudentId;
        }

        public int GetHashCode(Student obj)
        {
            if (obj == null)
            {
                return 0;
            }
            else
            {
                return obj.ToString().GetHashCode();
            }
        }
    }
}
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示