두 목록을 비교하는 방법 서로에게?
이 질문에 이미 답변이 있습니다.
거기 있다고합시다
List<string> a1 = new List<string>();
List<string> a2 = new List<string>();
이렇게 할 방법이 있습니까?
if (a1 == a2)
{
}
목록 내의 요소가 동일하고 동일한 순서인지 확인하려면 다음을 사용할 수 있습니다 SequenceEqual.
if (a1.SequenceEqual(a2))
온라인 작업보기 : ideone
당신은 또한 사용할 수있는 경우를 제외하고 차이 여부가 있는지 여부를 확인하기 위해 (두 시퀀스의 차 집합을) :
IEnumerable<string> difference = a1.Except(a2);
if(!difference.Any()){}
SequenceEqual두 문자열 목록을 비교하는 가장 효율적인 방법이 아니라는 것을 발견했습니다 (처음에는 http://www.dotnetperls.com/sequenceequal ).
나는 이것을 직접 테스트하고 싶었으므로 두 가지 방법을 만들었습니다.
/// <summary>
/// Compares two string lists using LINQ's SequenceEqual.
/// </summary>
public bool CompareLists1(List<string> list1, List<string> list2)
{
return list1.SequenceEqual(list2);
}
/// <summary>
/// Compares two string lists using a loop.
/// </summary>
public bool CompareLists2(List<string> list1, List<string> list2)
{
if (list1.Count != list2.Count)
return false;
for (int i = 0; i < list1.Count; i++)
{
if (list1[i] != list2[i])
return false;
}
return true;
}
두 번째 방법은 "읽기 더 쉬움"이되도록 리팩토링 할 수 있는지 궁금했던 약간의 코드입니다. (또한 LINQ 최적화가 더 빠를 지 궁금합니다.)
결과적으로, 32k 문자열을 포함하는 두 개의 목록, 100 개 이상의 실행 :
- 방법 1은 평균 6761.8 틱 소요
- 방법 2는 평균 3268.4 틱 소요
저는 일반적으로 간결함, 성능 및 코드 가독성을 위해 LINQ를 선호합니다. 하지만이 경우 루프 기반 방법이 선호된다고 생각합니다.
편집하다:
최적화 된 코드를 사용하여 재 컴파일하고 1000 회 반복 테스트를 실행했습니다. 결과는 여전히 루프를 선호합니다 (더욱 그렇습니다).
- 방법 1은 평균 4227.2 틱 소요
- 방법 2는 평균 1831.9 틱 소요
Core i7-920에서 Visual Studio 2010, C # .NET 4 클라이언트 프로필을 사용하여 테스트했습니다.
private static bool CompareDictionaries(IDictionary<string, IEnumerable<string>> dict1, IDictionary<string, IEnumerable<string>> dict2)
{
if (dict1.Count != dict2.Count)
{
return false;
}
var keyDiff = dict1.Keys.Except(dict2.Keys);
if (keyDiff.Any())
{
return false;
}
return (from key in dict1.Keys
let value1 = dict1[key]
let value2 = dict2[key]
select value1.Except(value2)).All(diffInValues => !diffInValues.Any());
}
아래의 모든 방법으로 목록을 확인할 수 있습니다.
List<string> FilteredList = new List<string>();
//Comparing the two lists and gettings common elements.
FilteredList = a1.Intersect(a2, StringComparer.OrdinalIgnoreCase);
참고URL : https://stackoverflow.com/questions/9602579/how-to-compare-two-liststring-to-each-other
'Programing' 카테고리의 다른 글
| prettier-eslint, eslint-plugin-prettier 및 eslint-config-prettier의 차이점은 무엇입니까? (0) | 2020.11.04 |
|---|---|
| SQL Server 프로파일 러 : "NOT LIKE"열 필터에 여러 값을 지정하는 방법 (0) | 2020.11.04 |
| 콘솔에 인쇄 된 문자를 지우는 방법 (0) | 2020.11.04 |
| OS X 10.8 업그레이드 후 Python pip가 손상됨 (0) | 2020.11.04 |
| 경로 가드에 매개 변수 전달 (0) | 2020.11.04 |