2009-11-13 2 views
1

큰 목록의 값 (100-200 문자열)이 있으며 그 목록을 구별해야합니다. .NET을 사용하여 가장 효율적인 방법은 무엇입니까? 내가 생각할 수있는 두 가지 방법이 있습니다 : 사전 접근 방식은 빠른 원시 측면에서 인 경우.NET을 사용하여 고유 한 항목 목록을 만드는 가장 효율적인 방법은 무엇입니까?

  1. 는 IEnumerable을 클래스의
  2. 사용하여 Dictionary

을 고유() 메서드를 사용을 고려 코드의 유지 가능성에 대한 절충안

답변

7

Enumerable.Distinct은 사전을 한 번만 사용하면 사전을 사용하는 것보다 빠르다고 생각합니다. 값을 추가/제거하고 고유 한 특성을 유지하려면 HashSet<string>을 만들 수 있습니다 (기본적으로 Distinct가 수행 할 것으로 예상되는 내용이지만 Distinct()은 분명히 새로운 값을 반환하고 유지하면서 유지 관리합니다. 위해 사실

바로 사용 :.. 당신이 순서를 신경 쓰지 않는 경우

HashSet<string> distinctItems = new HashSet<string>(list); 

은 꽤 좋은 (간단) 솔루션이 될 것입니다 그것은이 Dictionary를 사용하는 것보다 간단 엉망, 그리고 개념적으로되고 청소기뿐만 아니라 (당신이하지 않기 때문에 정말 키를 값으로 매핑하고 싶습니다.)

(필자는 가장 읽기 쉬운 솔루션을 먼저 찾고 벤치마킹을 제안합니다. "빠르다"면 그걸로 가십시오. 이것을 다른 쿼리의 일부로 사용하려면 Distinct이 가장 읽기 쉬운 방법 일 수 있습니다. 그렇지 않은 경우 HashSet을 제안합니다.

1

여기에서 프로파일 링을 사용하게되어 정말 기쁩니다. 샘플 항목으로 목록을 생성하고, 두 가지 방법을 사용하여 1M 번 말하고, 각 방법에 사용 된 시간을 측정합니다.

가독성이 문제가 될 경우 GetDistinctItems 메서드를 만들고 그 안에 코드를 넣으십시오 : voilà, self-documented code.

2

저는 개인적으로 LINQ에서 제공하는 Distinct() 메서드를 사용합니다. 읽고 읽고 유지하는 것이 훨씬 쉽습니다. 사전을 사용하는 것보다 LINQ를 사용하는 것이 더 느릴 수 있지만 (목록에있는 경우) 차이가 작을 것이며 데이터베이스 쿼리 또는 웹 서비스 호출을 최적화하는 데 더 많은 시간을 할애 할 수 있습니다.

관련 문제