C#: 두 목록 항목 비교

13778 단어 linqcsharptips
Linq에는 두 목록을 비교하는 유용한 방법이 있습니다.

교차


Intersect 를 사용하여 소스 목록의 어떤 요소가 비교 목록에도 포함되어 있는지 확인할 수 있습니다.

var source = new List<string>() { "a", "b", "c" };
var compare = new List<string>() { "b", "c", "d" };
var result = source.Intersect(compare);


결과는 아래와 같습니다.



제외하고


Except 를 사용하여 비교 목록에 포함되지 않은 소스 목록의 요소를 확인할 수 있습니다.

var source = new List<string>() { "a", "b", "c" };
var compare = new List<string>() { "b", "c", "d" };
var result = source.Except(compare);




복합형



비교할 속성을 지정하여 복잡한 유형을 사용하여 목록을 비교할 수도 있습니다. 예를 들어 Person 모델을 사용하는 경우 단순히 IntersectExcept도 사용할 수 없습니다. 다음 코드 결과에는 값이 없습니다.

var source = new List<Person>() { new Person("Ken", "Nakamura"), new Person("Nozomi", "Nakamura") };
var compare = new List<Person>() { new Person("Ken", "Nakamura"), new Person("Keiko", "Nakamura") };
var result = source.Intersect(compare);
Console.ReadLine();

public class Person
{
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
}


비교자 사용



두 방법 모두 비교자를 두 번째 인수로 사용합니다. LastName로 비교해보자.

public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.LastName == y.LastName;
    }

    public int GetHashCode(Person x)
    {
        return x.LastName.GetHashCode();
    }
}


이 클래스 인스턴스를 Intersect 의 두 번째 인수로 전달합니다.

var result = source.Intersect(compare, new PersonComparer());




IntersectBy 메서드 사용



단순히 키로 요소를 비교하려는 경우 비교자를 만드는 대신 IntersectBy를 사용할 수 있습니다. 다음 코드는 비교자를 사용하는 것과 동일한 출력을 생성합니다.

var source = new List<Person>() { new Person("Ken", "Nakamura"), new Person("Nozomi", "Nakamura") };
var compare = new List<Person>() { new Person("Ken", "Nakamura"), new Person("Keiko", "Nakamura") };
var result = source.IntersectBy(compare.Select(x => x.LastName), x => x.LastName);


IEquatable 사용



같은 것을 달성하는 다른 방법은 클래스 자체에 대해 IEquatable을 갖는 것입니다.

public class Person: IEquatable<Person>
{
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;

    public bool Equals(Person? other) => this.LastName == other?.LastName;
    public override int GetHashCode() => (LastName).GetHashCode();
}


그런 다음 간단히 Intersect를 호출할 수 있습니다.

var result = source.Intersect(compare);


요약



구현에 따라 두 목록을 비교하는 방법에는 여러 가지가 있습니다.

좋은 웹페이지 즐겨찾기