두 목록이 동일한 지 확인하십시오
다음과 같은 수업이 있습니다.
public class Tag {
public Int32 Id { get; set; }
public String Name { get; set; }
}
그리고 두 가지 태그 목록이 있습니다.
List<Tag> tags1;
List<Tag> tags2;
의 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();
사용 하고 있는데 오류가 발생합니다.
mscorlib.dll에서 'System.NotSupportedException'유형의 예외가 발생했지만 사용자 코드에서 처리되지 않았습니다.추가 정보 : LINQ to Entities는 'Boolean SetEquals (System.Collections.Generic.IEnumerable`1 [System.Int32])'메소드를 인식하지 못하므로이 메소드를 상점 표현식으로 변환 할 수 없습니다.
이 문제를 어떻게 해결합니까?
메소드가 참조 동등성을 검사
하므로 순서 동등성을 검사하는 데 사용 합니다 .
Equals
var a = ints1.SequenceEqual(ints2);
또는 요소 순서에 신경 쓰지 않으면
방법을 사용하십시오 .
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>
동일성은 요소별로 검사하지 않습니다. 이를 위해
을 사용할 수 있습니다 .
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
'Programming' 카테고리의 다른 글
| libiconv가 없어서 Mac OS에서 Nokogiri 설치가 실패하는 이유는 무엇입니까? (0) | 2020.06.09 |
|---|---|
| Gemfile에서 로컬 .gem 파일을 어떻게 지정합니까? (0) | 2020.06.09 |
| linq를 사용하여 두 개의 객체 목록에서 목록 만들기 (0) | 2020.06.09 |
| 자바 SSL 및 인증서 키 저장소 (0) | 2020.06.09 |
| Nexus 4를 adb에 연결할 수 없음 : 승인되지 않음 (0) | 2020.06.08 |