通用集合,允许使用相同的键

7

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

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


你可以使用 Dictionary<int,IEnumerable<string>> - L.B
你打算用它做什么?了解正确的数据结构与数据本身关系不大,而与如何访问数据有关。你是否经常获取每个键的值,通常对所有/许多值执行聚合操作,添加/删除元素,如果是这样,它们是任意的还是基于某些“开始”和/或“结束”,集合是否需要排序等。 - Servy
Tuple.Item1是一个具有许多属性的类,而Tuple.Item2是一个包含“Left”、“Right”、“Front”或“Back”的字符串。集合中最多不超过10个项。 - Elmo
我基本上是将所有 Tuple.Item2 =“Left”Tuple.Item1 项目存储在不同的集合中,以此类推。 - Elmo
3个回答

11

你可以使用包含自定义类的 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);
}

6
使用自定义的ClassList
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" });

为什么需要一个内置的集合?本质上,这实际上已经是一个了。 - Dave Zych

2
简而言之:最简单的方法是使用泛型 List<T> 集合,跳过 ArrayList 类。因为需要考虑一些性能方面的问题。
此外,您也可以使用 List<KeyValuePair<string,int>>。 这将存储一组可重复的 KeyValuePair
在决定是否使用具有类似功能的 List<T> 或 ArrayList 类时,请记住,在大多数情况下,List<T> 类性能更好且类型安全。如果在 List<T> 类型 T 中使用引用类型,则两个类的行为相同。但是,如果使用值类型作为类型 T,则需要考虑实现和装箱问题。
作为参考,您可以使用以下 MSDN 文章-List Class

除非与遗留应用程序进行交互,否则基本上不应使用 ArrayList。除了 List 之外,可能还有完全不同的适当结构。(没有足够的信息可以确定。) - Servy
为什么要提到ArrayList呢?当考虑适当的数据结构时,我甚至不会考虑或展示它作为一个选项。只有在被迫使用时才会使用它。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接