是否存在既充当列表又充当字典的数据类型

本文关键字:字典 数据类型 列表 存在 是否 | 更新日期: 2023-09-27 18:09:15

通常当我需要一个int/string/etc的列表时。我创建了如下列表:

var list = new List<string>

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

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

是否存在既充当列表又充当字典的数据类型

有。使用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

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

你是指HashSet<string>吗?

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

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

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

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

如果你只是在一组唯一值之后(并且随后不关心顺序),那么你应该看看HashSet<T>

从技术上讲,有System.Collections.Specialized.OrderedDictionary。然而,这是一个旧的未更新的(非泛型)类,我通常建议避免使用;-)

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

在实践中,我将创建一个最小的包装器类来公开所需的操作。(我可能会使用HashSet<T>(用于存在)和List<T>(用于排序),尽管在大多数情况下,对于相对较小的n来说,只有一个List<T>远远不够——记住大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中运行它来查看功能和它是如何工作的