当前位置: 代码网 > it编程>编程语言>Asp.net > C#比较两个List集合内容是否相同的几种方法

C#比较两个List集合内容是否相同的几种方法

2025年02月10日 Asp.net 我要评论
在 c# 中,要比较两个list<t>集合的内容是否相同,可以通过以下几种方法:一、非自定义类的元素比较1. 使用sequenceequal方法(顺序和内容都相等)顺序和内容都相等:使用s

在 c# 中,要比较两个 list<t> 集合的内容是否相同,可以通过以下几种方法:

 一、非自定义类的元素比较

1. 使用 sequenceequal 方法(顺序和内容都相等)

顺序和内容都相等:使用 sequenceequal

using system;
using system.collections.generic;
using system.linq;
 
class program
{
    static void main()
    {
        list<int> list1 = new list<int> { 1, 2, 3, 4 };
        list<int> list2 = new list<int> { 1, 2, 3, 4 };
 
        bool areequal = list1.sequenceequal(list2);
        console.writeline($"are the lists equal? {areequal}");
    }
}

2. 自定义比较逻辑(如果顺序不重要)

忽略顺序:可以先对两个列表排序后再使用 sequenceequal

using system;
using system.collections.generic;
using system.linq;
 
class program
{
    static void main()
    {
        list<int> list1 = new list<int> { 1, 2, 3, 4 };
        list<int> list2 = new list<int> { 4, 3, 2, 1 };
 
        bool areequal = list1.orderby(x => x).sequenceequal(list2.orderby(x => x));
        console.writeline($"are the lists equal (ignoring order)? {areequal}");
    }
}

3. 使用 set 比较(忽略重复元素)

忽略重复元素:可以使用 hashset<t>

using system;
using system.collections.generic;
 
class program
{
    static void main()
    {
        list<int> list1 = new list<int> { 1, 2, 3, 4 };
        list<int> list2 = new list<int> { 4, 3, 2, 1 };
 
        bool areequal = new hashset<int>(list1).setequals(list2);
        console.writeline($"are the lists equal (ignoring duplicates)? {areequal}");
    }
}

二、自定义类的元素比较

如果你想比较自定义对象的集合,比如 list<myclass>,你需要自定义比较规则。默认情况下,list<t> 的比较是基于对象引用的比较(即两个对象的引用是否相同),而不是根据对象的内容来判断。

为了比较自定义元素,你需要重写 equals 和 gethashcode 方法。这样,比较时会依据你定义的规则进行比较。

假设你有一个自定义类 person,你想根据 name 和 age 属性来判断两个 person 对象是否相同。

重写 equals 和 gethashcode

你需要重写 equals 方法来比较两个对象是否相等,并且重写 gethashcode,以确保集合操作(如 hashset 和 except)正常工作。

1、equals 方法比较两个 person 对象的 name 和 age 属性。

 public override bool equals(object obj)
    {
        if (obj is person other)
        {
            return this.name == other.name && this.age == other.age;
        }
        return false;
    }

2、gethashcode 使用 hashcode.combine 来生成一个基于 name 和 age 的哈希值,确保两个内容相同的 person 对象具有相同的哈希值。

 public override int gethashcode()
    {
        return hashcode.combine(name, age);
    }

1. 顺序和内容都相等

顺序和内容都相等:使用 sequenceequal

using system;
using system.collections.generic;
using system.linq;
 
class person
{
    public string name { get; set; }
    public int age { get; set; }
 
    public override bool equals(object obj)
    {
        if (obj is person other)
        {
            return this.name == other.name && this.age == other.age;
        }
        return false;
    }
 
    public override int gethashcode()
    {
        return hashcode.combine(name, age);
    }
}
 
class program
{
    static void main()
    {
        list<person> list1 = new list<person>
        {
            new person { name = "alice", age = 25 },
            new person { name = "bob", age = 30 }
        };
        list<person> list2 = new list<person>
        {
            new person { name = "alice", age = 25 },
            new person { name = "bob", age = 30 }
        };
 
        bool issame = list1.sequenceequal(list2);
        console.writeline($"顺序和内容都相等: {issame}");
    }
}

2. 忽略顺序

忽略顺序:先对两个列表排序,然后使用 sequenceequal

using system;
using system.collections.generic;
using system.linq;
 
class person
{
    public string name { get; set; }
    public int age { get; set; }
 
    public override bool equals(object obj)
    {
        if (obj is person other)
        {
            return this.name == other.name && this.age == other.age;
        }
        return false;
    }
 
    public override int gethashcode()
    {
        return hashcode.combine(name, age);
    }
}
 
class program
{
    static void main()
    {
        list<person> list1 = new list<person>
        {
            new person { name = "alice", age = 25 },
            new person { name = "bob", age = 30 }
        };
        list<person> list2 = new list<person>
        {
            new person { name = "bob", age = 30 },
            new person { name = "alice", age = 25 }
        };
 
        bool issame = list1.orderby(p => p.name).thenby(p => p.age).sequenceequal(
            list2.orderby(p => p.name).thenby(p => p.age)
        );
        console.writeline($"忽略顺序: {issame}");
    }
}

3. 忽略重复元素

忽略重复元素:将列表转换为 hashset<t>,然后使用 setequals 方法进行比较。 

如果你希望忽略重复元素并只关心唯一元素是否相同,可以使用 hashset<t> 来进行比较。hashset<t> 会自动去除重复元素,因此可以通过将列表转换为 hashset<t> 来忽略重复元素。

using system;
using system.collections.generic;
 
class person
{
    public string name { get; set; }
    public int age { get; set; }
 
    public override bool equals(object obj)
    {
        if (obj is person other)
        {
            return this.name == other.name && this.age == other.age;
        }
        return false;
    }
 
    public override int gethashcode()
    {
        return hashcode.combine(name, age);
    }
}
 
class program
{
    static void main()
    {
        list<person> list1 = new list<person>
        {
            new person { name = "alice", age = 25 },
            new person { name = "alice", age = 25 },
            new person { name = "bob", age = 30 }
        };
        list<person> list2 = new list<person>
        {
            new person { name = "bob", age = 30 },
            new person { name = "alice", age = 25 }
        };
 
        bool issame = new hashset<person>(list1).setequals(new hashset<person>(list2));
        console.writeline($"忽略重复元素: {issame}");
    }
}

总结

  • 顺序和内容都相等:使用 sequenceequal
  • 忽略顺序:可以先对两个列表排序后再使用 sequenceequal
  • 忽略重复元素:可以使用 hashset<t>

以上就是c#比较两个list集合内容是否相同的几种方法的详细内容,更多关于c#比较两个list内容是否相等的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com