允许相同键的泛型集合

本文关键字:泛型 集合 许相同 | 更新日期: 2023-09-27 17:50:31

HashTableDictionary这样的集合不允许添加具有相同键的值,但我想在Collection<int,string>中存储具有相同键的相同值。

是否有一个内置的集合可以让我这样做?

允许相同键的泛型集合

您可以使用包含自定义类的List<T>,甚至List<Tuple<int,string>>

List<Tuple<int,string>> values = new List<Tuple<int,string>>();
values.Add(Tuple.Create(23, "Foo"));
values.Add(Tuple.Create(23, "Bar"));

或者,您可以创建一个Dictionary<int, List<string>>(或其他字符串集合),并以这种方式填充值。

Dictionary<int, List<string>> dict = new Dictionary<int, List<string>>();
dict.Add(23, new List<string> { "Foo", "Bar" });

这样做的优点是仍然提供按键的快速查找,同时允许每个键有多个值。然而,稍后添加值就有点棘手了。如果使用这种方法,我会将添加的值封装在一个方法中,例如:

void Add(int key, string value)
{
    List<string> values;
    if (!dict.TryGetValue(key, out values))
    {
        values = new List<string>();
        dict[key] = values;
    }
    values.Add(value);
}

使用List和自定义Class

public class MyClass
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
}
List<MyClass> myList = new List<MyClass>();
myList.Add(new MyClass { MyInt = 1, MyString = "string" });

简而言之:最简单的方法是使用通用的List<T>集合,同时跳过ArrayList类。因为,有一些性能方面的考虑需要考虑。

此外,您还可以使用List<KeyValuePair<string,int>>。这将存储一个可以复制的KeyValuePair列表。

在决定是否使用List<T> or ArrayList类(两者都具有类似的功能)时,请记住List<T>在大多数情况下性能更好,并且是类型安全的。如果引用类型用于List<T>类的类型T,则两个类的行为是相同的。但是,如果值类型用于类型T,则需要考虑实现和装箱问题。

作为参考:您可以使用以下MSDN文章-列表类。