У меня есть список ~9000 продуктов, и некоторые из которых могут иметь дубликаты.
Я хотел сделать HashTable этих продуктов с порядковым номером продуктов как их ключ, таким образом, я могу найти дубликаты легко.
Как можно было бы пойти об использовании HashTable в C#/.NET? HashSet был бы более соответствующим?
В конечном счете я хотел бы список как:
Ключевой последовательный: 11110 - содержит: Product1
Ключевой последовательный: 11111 - содержит: Product3, Product6, Product7
Ключевой последовательный: 11112 - содержит: Product4
Ключевой последовательный: 11113 - содержит: Product8, Product9
Так, у меня есть список всех продуктов, и они сгруппированы теми, которые имеют дублирующиеся порядковые номера. Что "корректный" путь состоит в том, чтобы сделать это?
Я думаю, что словарь является рекомендуемым классом для таких вещей.
это было бы что-то вроде этого в вашем случае
Dictionary<string, List<Product>>
(используя последовательную строку в качестве ключа)
. Сначала вам нужно определить ваш "Первичный ключ" как есть, набор полей, которые уникальны для каждого объекта. Я думаю 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)];
}
}
Hashtable - это своего рода словарь, а хеш-метатель - это своего рода набор. Ни однозначные словари, ни наборы непосредственно решают вашу проблему - вам нужна структура данных, которая содержит несколько объектов для одного ключа.
Такие базы данных часто называют мультимаптами. Вы можете создать один, просто используя Hashtable, где тип ключей являются целыми числами, а типы значений являются наборами какого-либо (например, Hashsets ...).
В качестве альтернативы вы можете посмотреть на существующие MultiMap Solutions, такие как здесь: MultiMap в .NET .
Для получения информации об использовании HASHTables вы можете проверить его на MSDN: http://msdn.microsoft.com/en-us/library/system.coLlions.hashtable.aspx , и есть Много других учебных пособий - поиск по использованию либо «Hashtable» или «словарь».
Обычный словарь будет набирать это лучшее, я думаю. Код может выглядеть что-то подобное:
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}));
}