Programming

두 목록이 동일한 지 확인하십시오

procodes 2020. 6. 9. 22:33
반응형

두 목록이 동일한 지 확인하십시오


다음과 같은 수업이 있습니다.

public class Tag {
    public Int32 Id { get; set; }
    public String Name { get; set; }
}

그리고 두 가지 태그 목록이 있습니다.

List<Tag> tags1;
List<Tag> tags2;

 

LINQ

의 select를 사용 하여 각 태그 목록의 ID를 가져 왔습니다. 그리고:

List<Int32> ids1 = new List<Int32> { 1, 2, 3, 4 };
List<Int32> ids2 = new List<Int32> { 1, 2, 3, 4 };
List<Int32> ids3 = new List<Int32> { 2, 1, 3, 4 };
List<Int32> ids4 = new List<Int32> { 1, 2, 3, 5 };
List<Int32> ids5 = new List<Int32> { 1, 1, 3, 4 };

ids1은 ids2 및 ids3과 같아야합니다. 둘 다 같은 숫자를 갖습니다.ids1은 ids4 및 ids5와 같아서는 안됩니다 ...나는 다음을 시도했다.

var a = ints1.Equals(ints2);
var b = ints1.Equals(ints3);

하지만 둘 다 거짓을 줘.태그 목록이 동일한 지 확인하는 가장 빠른 방법은 무엇입니까?

최신 정보

책의 태그와 태그가 정확히 동일한 POSTS를 찾고 있습니다.

IRepository repository = new Repository(new Context());

IList<Tags> tags = new List<Tag> { new Tag { Id = 1 }, new Tag { Id = 2 } };

Book book = new Book { Tags = new List<Tag> { new Tag { Id = 1 }, new Tag { Id = 2 } } };

var posts = repository
  .Include<Post>(x => x.Tags)
  .Where(x => new HashSet<Int32>(tags.Select(y => y.Id)).SetEquals(book.Tags.Select(y => y.Id)))
  .ToList();

 

Entity Framework를

사용 하고 있는데 오류가 발생합니다.

mscorlib.dll에서 'System.NotSupportedException'유형의 예외가 발생했지만 사용자 코드에서 처리되지 않았습니다.추가 정보 : LINQ to Entities는 'Boolean SetEquals (System.Collections.Generic.IEnumerable`1 [System.Int32])'메소드를 인식하지 못하므로이 메소드를 상점 표현식으로 변환 할 수 없습니다.

이 문제를 어떻게 해결합니까?


메소드가 참조 동등성을 검사

SequenceEqual

하므로 순서 동등성을 검사하는 데 사용 합니다 .

Equals

 

var a = ints1.SequenceEqual(ints2);

또는 요소 순서에 신경 쓰지 않으면

Enumerable.All

방법을 사용하십시오 .

var a = ints1.All(ints2.Contains);

두 번째 버전은 보다 많은 요소가 포함되어

Count

있어도 true를 반환하므로 다시 검사해야합니다 . 따라서 더 정확한 버전은 다음과 같습니다.

ints2

 

ints1

 

var a = ints1.All(ints2.Contains) && ints1.Count == ints2.Count;

 

불평등

을 확인하려면

All

방법 의 결과를 반대로 바꾸십시오 .

var a = !ints1.All(ints2.Contains)

List<T>

동일성은 요소별로 검사하지 않습니다. 이를 위해

LINQ의 SequenceEqual방법

사용할 수 있습니다 .

var a = ints1.SequenceEqual(ints2);

순서를 무시하려면 다음을 사용하십시오

SetEquals

.

var a = new HashSet<int>(ints1).SetEquals(ints2);

중복이 포함되지 않은 일련의 ID를 비교하고 있기 때문에 작동합니다. 그렇다면 중복을 고려해야 할 경우 선형 시간으로 해시 기반의 카운트 사전을 작성하고 첫 번째 시퀀스의 각 요소에 하나씩 추가하고 두 번째의 각 요소에 대해 하나씩 빼는 것입니다 결과 카운트가 모두 0인지 확인하십시오.

var counts = ints1
    .GroupBy(v => v)
    .ToDictionary(g => g.Key, g => g.Count());
var ok = true;
foreach (var n in ints2) {
    int c;
    if (counts.TryGetValue(n, out c)) {
        counts[n] = c-1;
    } else {
        ok = false;
        break;
    }
}
var res = ok && counts.Values.All(c => c == 0);

마지막으로

O(N*LogN)

솔루션에 문제가 없으면 두 시퀀스를 정렬하고을 사용하여 동일성을 비교할 수 있습니다

SequenceEqual

.


Enumerable.SequenceEqual(FirstList.OrderBy(fElement => fElement), 
                         SecondList.OrderBy(sElement => sElement))

참고 URL :

https://stackoverflow.com/questions/22173762/check-if-two-lists-are-equal

반응형