11

我有一个大约 9000 种产品的列表,其中一些可能有重复。

我想用产品序列号作为它们的键来制作这些产品的哈希表,这样我就可以很容易地找到重复项。

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

最终我想要一个像这样的列表:

密钥序列号:11110 - 包含:Product1
密钥序列号:11111 - 包含:Product3、Product6、Product7
密钥序列号:11112 - 包含:Product4
密钥序列号:11113 - 包含:Product8、Product9

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

4

6 回答 6

13

我认为 Dictionary 是此类内容的推荐类。

在你的情况下是这样的

Dictionary<string, List<Product>>

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

于 2010-01-03T19:00:35.877 回答
7

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

这样的数据库通常称为多图。您可以通过简单地使用哈希表来创建一个,其中键的类型是整数,值的类型是某种集合(例如,哈希集......)。

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

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

于 2010-01-03T19:05:55.197 回答
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}));
}
于 2010-01-03T19:05:25.753 回答
2

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

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

查找和字典(列表)之间存在一些差异。即, Lookup 是不可变的(创建后不能添加或删除元素或键)。根据您计划使用数据的方式,与 GroupBy() 相比,查找可能更有利。

于 2014-06-10T14:59:16.230 回答
1

首先,您需要按原样定义“主键”,即每个对象唯一的一组字段。我想Key-Serial应该是那个系列的一部分,但肯定还有其他的。一旦定义了“主键”,您就可以定义一个表示 a 的结构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)];
    }
}
于 2010-01-03T19:00:33.180 回答
0

如果您只想拥有一个重复列表,您可以:

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

  • 创建一个Hashset<T>相同的IEnumerable<T>(只要整行不同,它就会保留重复的键)

  • 然后遍历dictionary.Values,调用hashset.Remove(value)每个值

剩下的hashset是重复项。

于 2012-12-12T15:18:45.957 回答