C# 如何在.NET中使用哈希表/哈希集?

C# 如何在.NET中使用哈希表/哈希集?,c#,.net,data-structures,hashtable,hashset,C#,.net,Data Structures,Hashtable,Hashset,我有一份约9000种产品的清单,其中有些可能有重复的 我想用产品序列号作为它们的键来制作这些产品的哈希表,这样我就可以很容易地找到重复的产品 在C#/.NET中如何使用哈希表?哈希集更合适吗 最后,我想要一份如下列表: 密钥序列号:11110-包含:Product1 密钥序列号:11111-包含:产品3、产品6、产品7 密钥序列号:11112-包含:Product4 密钥序列号:11113-包含:Product8、Product9 所以,我有一个所有产品的列表,它们按序列号重复的产品分组。“正确

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

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

在C#/.NET中如何使用哈希表?哈希集更合适吗

最后,我想要一份如下列表:

密钥序列号:11110-包含:Product1
密钥序列号:11111-包含:产品3、产品6、产品7
密钥序列号:11112-包含:Product4
密钥序列号:11113-包含:Product8、Product9


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

首先,您需要按原样定义“主键”,即一组对每个对象唯一的字段。我想,
键序列号
应该是这一套的一部分,但肯定还有其他的。定义“主键”后,可以定义一个表示
键值的结构,并将其用作包含产品的字典的键

例如:

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)];
    }
}
struct ProductPrimaryKey
{
公共字符串键序列;
公共字符串鉴别器;
public ProductPrimaryKey(字符串keySerial、字符串otherDiscriminator)
{
KeySerial=KeySerial;
其他鉴别器=其他鉴别器;
}
}
类产品
{
公共字符串键序列{get;set;}
公共字符串其他鉴别器{get;set;}
公共数据{get;set;}
}
类数据层
{
公共词典数据集
=新字典();
公共产品GetProduct(字符串键序列、字符串其他鉴别器)
{
返回数据集[new ProductPrimaryKey(keySerial,otherDiscriminator)];
}
}

我认为Dictionary是此类课程的推荐课程

在你的情况下是这样的

Dictionary<string, List<Product>>
字典

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

我认为,通用词典最适合这种情况。代码可能如下所示:

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}));
}
var-keyedProducts=new Dictionary();
foreach(keyProductPairs中的var keyProductPair)
{
if(keyedProducts.Contains(keyProductPair.Key))
keyedProducts[keyProductPair.Key]。添加(keyProductPair.Product);
其他的
添加(keyProductPair.Key,新列表(new[]{keyProductPair.Product}));
}

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

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

或者,您可以查看现有的多重贴图解决方案,例如:


有关使用哈希表的信息,您可以在MSDN:上查看,还有很多其他教程-使用“哈希表”或“字典”进行搜索。

如果您只想获得重复列表,您可以:

  • 以创建一个表条目的
    字典
    (我们称之为
    IEnumerable
    (它忽略重复的键)

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

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

散列集中剩下的是副本。

现在在.NET中可用的一个很好的选项是类。来自MSDN文档:

查找(TKey,TElement)类似于字典(TKey,TValue)。区别在于字典(TKey,TValue)将键映射到单个值,而查找(TKey,TElement)将键映射到值集合


在查找和字典(列表)之间有一个不可更改的位置。也就是说,查找是不可更改的(创建后不能添加或删除元素或键)。根据您计划如何使用数据,查找可能是有利的。

这是一个难题,您如何从列表中选择正确的产品?没有唯一键可以替代。为什么这是一个难题?问题是关于按序列对产品进行分组。这是一个简单易懂的答案,符合要求不