3

我想知道在 C# 中存储一组字符串列表的最有效方法是什么。

背景

我的目标是存储有关“属性”的信息,例如Hold(object)or Location(x,y,object)。为此,我有一个字典,将属性名称映射到“一组值”。

例如,假设我为具有这些值的“位置”属性设置了“位置”

location -> ["1","2","robot1"]
            ["2","3","robot2"]
            ["2","5","key1"]

我想执行查询

DB["location"].Contains(["1","2","robot1"])

我不知道这是否可能,但这是为了让您了解我需要什么。:)

我做了什么

我必须经常修改和访问这些数据,所以我选择了 HashSet。但我有两个主要选择:

  1. 第一种是使用类似HashSet<string[]>. 问题是我认为 HashSet 找不到重复项,因为标准行为是通过引用比较数组。出于同样的原因,我不知道解决“检查 [a,b,c] 是否包含在集合中”问题的好方法。
  2. 第二个是使用类似的东西HashSet<List<string>>。但我不需要 List 来存储一组简单的元组。在我看来,这样一份简单的工作太过分了。

另一种方法是编写我自己的类来存储“参数”,但如果标准库中存在某些东西,我不想这样做。:)

谢谢 :)

4

2 回答 2

3

另一种方法是编写我自己的类来存储“参数”,但如果标准库中存在某些东西,我不想这样做。:)

这实际上是我的偏好。虽然编写它需要一些工作,但拥有一个实际类型来保存值提供了将相等性直接构建到类型中的能力,并使其用法非常明确。

在您的情况下,您可以存储 2 个整数和一个字符串而不是 3 个字符串等。更重要的是,可以适当地命名intstring值,这反过来使您的代码更具可读性和可理解性。

于 2013-05-24T16:27:11.020 回答
1

使用 HashSet 和 Tuple 可能是一种选择

HashSet<Tuple<int, int, string>> collections;

如果您更喜欢使用所有字符串:

HashSet<Tuple<string, string, string>> collections;

对于 Tuple 的相等性,您可能会发现此 MSDN 链接很有用。无论您喜欢哪种形式,都可以使用以下示例作为参考:

Tuple<string, double, int>[] scores = 
                  { Tuple.Create("Ed", 78.8, 8),
                    Tuple.Create("Abbey", 92.1, 9), 
                    Tuple.Create("Ed", 71.2, 9),
                    Tuple.Create("Sam", 91.7, 8), 
                    Tuple.Create("Ed", 71.2, 5),
                    Tuple.Create("Penelope", 82.9, 8),
                    Tuple.Create("Ed", 71.2, 9),
                    Tuple.Create("Judith", 84.3, 9) };

  // Test each tuple object for equality with every other tuple. 
  for (int ctr = 0; ctr < scores.Length; ctr++)
  {
     var currentTuple = scores[ctr];
     for (int ctr2 = ctr + 1; ctr2 < scores.Length; ctr2++)
        Console.WriteLine("{0} = {1}: {2}", currentTuple, scores[ctr2], 
                                            currentTuple.Equals(scores[ctr2]));      

     Console.WriteLine();
  }   
}
于 2013-05-24T16:36:57.953 回答