Как я использую Hashtables/HashSets в.NET?

У меня есть список ~9000 продуктов, и некоторые из которых могут иметь дубликаты.

Я хотел сделать HashTable этих продуктов с порядковым номером продуктов как их ключ, таким образом, я могу найти дубликаты легко.

Как можно было бы пойти об использовании HashTable в C#/.NET? HashSet был бы более соответствующим?

В конечном счете я хотел бы список как:

Ключевой последовательный: 11110 - содержит: Product1
Ключевой последовательный: 11111 - содержит: Product3, Product6, Product7
Ключевой последовательный: 11112 - содержит: Product4
Ключевой последовательный: 11113 - содержит: Product8, Product9

Так, у меня есть список всех продуктов, и они сгруппированы теми, которые имеют дублирующиеся порядковые номера. Что "корректный" путь состоит в том, чтобы сделать это?

11
задан Biro 3 January 2010 в 18:56
поделиться

4 ответа

Я думаю, что словарь является рекомендуемым классом для таких вещей.

это было бы что-то вроде этого в вашем случае

Dictionary<string, List<Product>>

(используя последовательную строку в качестве ключа)

.
11
ответ дан 3 December 2019 в 03:35
поделиться

Сначала вам нужно определить ваш "Первичный ключ" как есть, набор полей, которые уникальны для каждого объекта. Я думаю Key-Serial будет частью этого набора, но должны быть и другие. Как только вы определили этот 'Primary Key', вы можете определить структуру, которая представляет 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)];
    }
}
1
ответ дан 3 December 2019 в 03:35
поделиться

Hashtable - это своего рода словарь, а хеш-метатель - это своего рода набор. Ни однозначные словари, ни наборы непосредственно решают вашу проблему - вам нужна структура данных, которая содержит несколько объектов для одного ключа.

Такие базы данных часто называют мультимаптами. Вы можете создать один, просто используя Hashtable, где тип ключей являются целыми числами, а типы значений являются наборами какого-либо (например, Hashsets ...).

В качестве альтернативы вы можете посмотреть на существующие MultiMap Solutions, такие как здесь: MultiMap в .NET .

Для получения информации об использовании HASHTables вы можете проверить его на MSDN: http://msdn.microsoft.com/en-us/library/system.coLlions.hashtable.aspx , и есть Много других учебных пособий - поиск по использованию либо «Hashtable» или «словарь».

7
ответ дан 3 December 2019 в 03:35
поделиться

Обычный словарь будет набирать это лучшее, я думаю. Код может выглядеть что-то подобное:

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}));
}
6
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: