C# 如何在.NET中使用哈希表/哈希集?
我有一份约9000种产品的清单,其中有些可能有重复的 我想用产品序列号作为它们的键来制作这些产品的哈希表,这样我就可以很容易地找到重复的产品 在C#/.NET中如何使用哈希表?哈希集更合适吗 最后,我想要一份如下列表: 密钥序列号:11110-包含:Product1C# 如何在.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 所以,我有一个所有产品的列表,它们按序列号重复的产品分组。“正确
密钥序列号: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)将键映射到值集合
在查找和字典(列表)之间有一个不可更改的位置。也就是说,查找是不可更改的(创建后不能添加或删除元素或键)。根据您计划如何使用数据,查找可能是有利的。这是一个难题,您如何从列表中选择正确的产品?没有唯一键可以替代。为什么这是一个难题?问题是关于按序列对产品进行分组。这是一个简单易懂的答案,符合要求不