중복을 무시하고 문자열 목록을 저장하는 가장 효율적인 방법은 무엇입니까? dict [str] = false; 키를 통해 목록으로 열거합니다. 그게 좋은 해결책인가요?
중복을 무시하고 문자열 목록을 저장하는 가장 효율적인 방법은 무엇입니까? dict [str] = false; 키를 통해 목록으로 열거합니다. 그게 좋은 해결책인가요?
답변:
.NET 3.5를 사용하는 경우 HashSet 이 작동합니다.
HashSet <(Of <(T>)>) 클래스는 고성능 집합 작업을 제공합니다. 집합은 중복 요소를 포함하지 않고 요소가 특정 순서가 아닌 컬렉션입니다.
이런 식으로 할 수 있습니다.
var hash = new HashSet<string>();
var collectionWithDup = new []{"one","one","two","one","two","zero"};
// No need to check for duplicates as the Add method
// will only add it if it doesn't exist already
foreach (var str in collectionWithDup)
hash.Add(str);
Linq를 다음과 같이 사용할 수도 있습니다.
using System.Linq;
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
List<string> distinctItems = items.Distinct().ToList();
HashSet을 사용하고 .Contains ()를 확인할 필요가 없습니다. 목록에 항목을 추가하기 만하면 중복되는 항목이 추가되지 않습니다.
HashSet<int> uniqueList = new HashSet<int>();
uniqueList.Add(1); // List has values 1
uniqueList.Add(2); // List has values 1,2
uniqueList.Add(1); // List has values 1,2
Console.WriteLine(uniqueList.Count); // it will return 2
이것은 시스템 네임 스페이스의 일부가 아니지만 NHibernate와 함께 http://www.codeproject.com/KB/recipes/sets.aspx 의 Iesi.Collections를 사용했습니다 . 정렬 된 세트, 사전 세트 등과 함께 해시 된 세트를 지원합니다. NHibernate와 함께 사용 되었기 때문에 광범위하고 매우 안정적으로 사용되었습니다. .Net 3.5도 필요하지 않습니다.
다음은 HashSet
.
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
var uniqueItems = items.Where((item, index) => items.IndexOf(item) == index);
이 스레드에서 채택되었습니다 : javascript-배열의 고유 값
테스트:
using FluentAssertions;
uniqueItems.Count().Should().Be(3);
uniqueItems.Should().BeEquivalentTo("one", "two", "zero");
성능에 대한 테스트 List
, HashSet
및 SortedSet
. 1 백만 회 반복 :
List: 564 ms
HashSet: 487 ms
SortedSet: 1932 ms
HashSet
항목의 순서를 잃을 것입니다. A가List
제공 하는 기능 입니다.