如何在.NET中使用Hashtables / HashSet?

时间:2010-01-03 18:56:44

标签: c# .net data-structures hashtable hashset

我有一份约9000种产品的清单,其中一些可能有重复产品。

我想用产品序列号作为密钥制作这些产品的HashTable,这样我就可以轻松找到重复项。

如何在C#/ .NET中使用HashTable? HashSet会更合适吗?

最终我想要一个如下列表:

Key-Serial:11110 - 包含:Product1
Key-Serial:11111 - 包含:Product3,Product6,Product7
钥匙系列:11112 - 包含:产品4
Key-Serial:11113 - 包含:Product8,Product9

所以,我有一份所有产品的清单,它们按照具有重复序列号的产品进行分组。这样做的“正确”方法是什么?

6 个答案:

答案 0 :(得分:10)

我认为Dictionary是推荐的类这样的东西。

在你的情况下会是这样的

Dictionary<string, List<Product>>

(使用串行字符串作为键)

答案 1 :(得分:7)

哈希表是一种字典,哈希集是一种集合。词典和集合都不能直接解决您的问题 - 您需要一个数据结构,它为一个键保存多个对象。

此类数据库通常称为多重映射。您可以通过简单地使用散列表创建一个,其中键的类型是整数,值的类型是某种类型的集合(例如,hashsets ...)。

或者,您可以查看现有的多地图解决方案,例如: multimap in .NET

有关使用哈希表的信息,您可以在MSDN上查看:http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx,还有很多其他教程 - 使用“HashTable”或“Dictionary”进行搜索。

答案 2 :(得分: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}));
}

答案 3 :(得分:2)

.NET现在提供的一个很好的选择是Lookup类。从MSDN文档:

  

查找(TKey,TElement)类似于Dictionary(Of TKey,TValue)。不同之处在于Dictionary(Of TKey,TValue)将键映射到单个值,而Lookup(Of TKey,TElement)将键映射到值集合。

查找和字典(列表中)之间有are some differences。也就是说,Lookup是不可变的(在创建后不能添加或删除元素或键)。根据您计划使用数据的方式,查找可能是有利的compared to GroupBy()

答案 4 :(得分: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)];
    }
}

答案 5 :(得分:0)

如果您想要一个重复列表,您可以:

  • 创建一个Dictionary<T>的表条目(让我们称之为IEnumerable<T>(忽略重复的密钥)

  • 创建相同Hashset<T>的{​​{1}}(保留重复的密钥,只要整行不相同)

  • 然后遍历IEnumerable<T>,为每个值调用dictionary.Values

hashset.Remove(value)中剩下的是重复内容。