C# 比较两个List集合内容是否相同

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

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List list1 = new List { 1, 2, 3, 4 };
        List list2 = new List { 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 list1 = new List { 1, 2, 3, 4 };
        List list2 = new List { 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

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List list1 = new List { 1, 2, 3, 4 };
        List list2 = new List { 4, 3, 2, 1 };

        bool areEqual = new HashSet(list1).SetEquals(list2);
        Console.WriteLine($"Are the lists equal (ignoring duplicates)? {areEqual}");
    }
}

 二、自定义类的元素比较

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

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

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

重写 EqualsGetHashCode

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

1、Equals 方法比较两个 Person 对象的 NameAge 属性。

 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 来生成一个基于 NameAge 的哈希值,确保两个内容相同的 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 list1 = new List
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 }
        };
        List list2 = new List
        {
            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 list1 = new List
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 }
        };
        List list2 = new List
        {
            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,然后使用 SetEquals 方法进行比较。 

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

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 list1 = new List
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 }
        };
        List list2 = new List
        {
            new Person { Name = "Bob", Age = 30 },
            new Person { Name = "Alice", Age = 25 }
        };

        bool isSame = new HashSet(list1).SetEquals(new HashSet(list2));
        Console.WriteLine($"忽略重复元素: {isSame}");
    }
}

总结

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

你可能感兴趣的:(c#,list,windows)