2010-01-03 3 views
11

~ 9000 개 제품 목록이 있고 그 중 일부는 중복 될 수 있습니다..NET에서 Hashtables/HashSet을 어떻게 사용합니까?

제품 일련 번호를 키로 사용하여 이러한 제품의 HashTable을 만들고 싶었 기 때문에 복제본을 쉽게 찾을 수있었습니다.

C#/.NET에서 HashTable을 사용하는 방법은 무엇입니까? HashSet이 더 적절한가?

키 - 직렬 :

은 결국 내가 좋아하는 목록 싶다 - 11111 - 포함 : : :
키 - 시리얼 제품 1을 11110을 포함 제품 3가, Product6, Product7이
는 키 - 직렬 : 11,112 - 포함 : Product4
Key-Serial : 11113 - 포함 : Product8, Product9

따라서 모든 제품의 목록이 있으며 일련 번호가 중복 된 그룹으로 그룹화되어 있습니다. 이렇게하는 "올바른"방법은 무엇입니까?

답변

1

먼저 각 개체에 고유 한 필드 집합 인 '기본 키'를 정의해야합니다. 나는 Key-Serial이 그 세트의 일부가 될 것이지만, 다른 세트가 있어야만한다고 생각합니다. '기본 키'를 정의하면 Key Value을 나타내는 구조체를 정의하고이를 제품이 포함 된 사전의 키로 사용할 수 있습니다.

예 :

struct ProductPrimaryKey 
{ 
    public string KeySerial; 
    public string OtherDiscriminator; 

    public ProductPrimaryKey(string keySerial, string otherDiscriminator) 
    { 
     KeySerial = keySerial; 
     OtherDiscriminator = otherDiscriminator; 
    } 
} 

class Product 
{ 
    public string KeySerial { get; set; } 
    public string OtherDiscriminator { get; set; } 
    public int MoreData { get; set; } 
} 

class DataLayer 
{ 
    public Dictionary<ProductPrimaryKey, Product> DataSet 
     = new Dictionary<ProductPrimaryKey, Product>(); 

    public Product GetProduct(string keySerial, string otherDiscriminator) 
    { 
     return DataSet[new ProductPrimaryKey(keySerial, otherDiscriminator)]; 
    } 
} 
9

나는 사전이 같은 물건에 대해 권장되는 클래스라고 생각합니다.

그것이

Dictionary<string, List<Product>> 

이 최고의 스위트 룸 것이다

+0

그것은 골치 거리에 불과합니다. 어떻게 목록에서 적절한 제품을 선택할 수 있습니까? 고유 한 키를 대체 할 수있는 것은 없습니다. –

+7

왜 이것이 진흙탕입니까? 문제는 일련의 제품을 그룹화하는 것이 었습니다. 이것은 요구 사항을 만족시키는 간단하고 단순하며 읽기 쉬운 대답입니다. –

6

일반적인 사전 (키로 시리얼 문자열을 사용하여) 귀하의 경우에는이 같은 될 것이라고, 나는 생각한다. 코드는 다음과 같습니다.

var keyedProducts = new Dictionary<int,List<string>>(); 

foreach (var keyProductPair in keyProductPairs) 
{ 
    if (keyedProducts.Contains(keyProductPair.Key)) 
    keyedProducts[keyProductPair.Key].Add(keyProductPair.Product); 
    else 
    keyedProducts.Add(keyProductPair.Key, new List<string>(new[]{keyProductPair.Product})); 
} 
7

해시 테이블은 일종의 사전이며 해시 세트는 일종의 집합입니다. 사전이나 세트 모두 직접 문제를 해결하지 못합니다. 하나의 키에 대해 여러 객체를 보유하는 데이터 구조가 필요합니다.

이러한 데이터베이스를 종종 멀티 맵이라고합니다. 키 유형이 정수이고 값 유형이 일종의 세트 (예 : 해시 세트 ...) 인 해시 테이블을 사용하여 간단하게 만들 수 있습니다.

또는 기존 멀티 매트릭스 솔루션 (예 : multimap in .NET)을 살펴볼 수 있습니다.

해시 테이블 사용에 대한 자세한 내용은 MSDN : http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx에서 확인할 수 있으며 "HashTable"또는 "사전"을 사용하여 검색하는 다른 자습서가 많이 있습니다.당신은 단순히 중복의 목록, 당신이 할 수있는 싶었다면

0

:

  • 이 테이블 항목의 Dictionary<T>을 만들 걸릴을 (생성의가) 중복 키를 무시하는 (

  • IEnumerable<T>를 호출하자 Hashset<T> 같은 IEnumerable<T> (전체 행이 동일하지 않으면 중복 키를 유지함)

  • 그리고 나서 dictionary.Values을 반복합니다. 각 값에 대해 hashset.Remove(value)을 호출하십시오.

hashset에 남은 것은 중복입니다.

1

이제 .NET에서 사용할 수있는 훌륭한 옵션은 Lookup 클래스입니다. MSDN 설명서에서 :

Lookup (Of TKey, TElement)은 Dictionary (Of TKey, TValue)와 유사합니다. 차이점은 Dictionary (Of TKey, TValue)는 키를 단일 값으로 매핑하는 반면 Lookup (Of TKey, TElement)은 키를 값 컬렉션에 매핑한다는 것입니다.

여기에 Lookup과 Dictionary (Of List) 사이에 are some differences이 있습니다. 즉, Lookup은 변경되지 않습니다 (요소 또는 키를 만든 후에 추가 또는 제거 할 수 없음). 데이터 사용 방법에 따라 Lookup이 유용 할 수 있습니다. compared to GroupBy().

관련 문제