是否存在既作为列表又作为字典的数据类型?

时间:2011-09-19 21:16:16

标签: c#

通常我需要一个int / strings / etc列表。我创建了一个列表:

var list = new List<string>

然后我创建一个包含所有字符串的哈希表,除非它不在哈希表中,否则我不会插入列表中,即强制列表中的唯一项。

是否有可以满足这两个要求的数据类型?

7 个答案:

答案 0 :(得分:6)

有。使用HashSet

var set = new HashSet<int>();
set.Add(4);
set.Add(4);   // there is already such an element in the set, no new elements added

但请记住,它不能保证元素的顺序。

答案 1 :(得分:1)

你的意思是HashSet<string>吗?

HashSet<T>中的所有元素都是唯一的; Add()方法返回bool以指示是否实际添加了新项目,或者是否为无操作项。

答案 2 :(得分:0)

  

是否有可以满足这两个要求的数据类型?

没有。哈希表将为您提供直接访问给定其唯一键的元素,而在列表中您不需要键,您肯定可以重复。

答案 3 :(得分:0)

您可以使用HashSet<T>数据类型MSDN。这只允许您拥有每个值的单个副本。

答案 4 :(得分:0)

如果您仅使用一组唯一值(并且随后不关心订购),那么您应该查看HashSet<T>

答案 5 :(得分:0)

从技术上讲,有System.Collections.Specialized.OrderedDictionary。但是,这是一个非更新(非泛型)类,我通常建议避免它; - )

  
    

表示密钥或索引可访问的键/值对的集合。

  

在实践中,我将创建一个公开所需操作的最小包装类。 (我可能会使用HashSet<T>(存在)和List<T>(用于排序),但只有一个List<T>对于相对较小的n来说已经足够了大多数情况下 - 记住Big-O是关于限制的。)

快乐的编码。

答案 6 :(得分:0)

HashSet<string> set = new HashSet<string>();

bool inserted = set.Add("Item");
bool insertedDuplicate = set.Add("Item");

inserted.Dump("Result1");
insertedDuplicate.Dump("Result2");

//Result
//Result1 = true
//Result2 = false

您可以在LinqPad中运行它以查看功能及其工作原理。