我有一份约9000种产品的清单,其中一些可能有重复产品。
我想用产品序列号作为密钥制作这些产品的HashTable,这样我就可以轻松找到重复项。
如何在C#/ .NET中使用HashTable? HashSet会更合适吗?
最终我想要一个如下列表:
Key-Serial:11110 - 包含:Product1
Key-Serial:11111 - 包含:Product3,Product6,Product7
钥匙系列:11112 - 包含:产品4
Key-Serial:11113 - 包含:Product8,Product9
所以,我有一份所有产品的清单,它们按照具有重复序列号的产品进行分组。这样做的“正确”方法是什么?
答案 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)
中剩下的是重复内容。