如何用两个键在c#中创建字典?

时间:2015-08-07 04:56:15

标签: c# dictionary

在C#中,我希望有一个将(x,y)坐标映射到(x,y)的数据结构。我怎么能这样做?

我不想使用像y*w+x之类的公式将x,y坐标转换为单个值。有没有办法dictionary<key,key,(value,value)>

如果我把密钥作为元组,那么它的一个对象和元组(1,1)不等于元组(1,1)。所以我不认为我能在这个意义上找到钥匙。

7 个答案:

答案 0 :(得分:2)

您不能只定义(或使用System.Drawing命名空间中的pre-existing structurePoint作为保存(x,y)的结构,然后在{Dictionary<Point, Point>中使用它1}}?

答案 1 :(得分:2)

如果您使用struct而不是class,则会根据(不是基于引用)来比较密钥,因为结构值类型

public struct Point
{
   public int x;
   public int y;
   public Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
 }

然后使用此结构

var dic = new Dictionary<Point,Point>();
dic.Add(new Point(1,1), new Point(1,2));

var f = dic[new Point(1,1)];
Console.WriteLine(f.x); //Output will be 1

答案 2 :(得分:1)

var dict = new Dictionary<Point,string>();
dict[new Point(1,3)] = "asd";

答案 3 :(得分:1)

您可以将任何类型的对象用作字典键,只要您正确覆盖该类型的GetHashCode()即可。这是字典将用于确定其中是否存在特定键的内容。因此,您可以创建自己的类并将其用作键。

查看此答案以获取更多信息:What is the best algorithm for an overridden System.Object.GetHashCode?

答案 4 :(得分:1)

我正在写这个答案,因为其他的似乎映射到1个字符串,你需要映射到2个字符串。 您可以尝试使用Point来存储x和y位置,然后创建一个元组字典。

var points = new Dictionary<Point,Tuple<string, string>>();
points[new Point(1,1)] = new Tuple<string, string>("2","2");

答案 5 :(得分:0)

public class Point
{
    public string X {get; protected set;}
    public string Y {get; protected set;}
    public Point(string x, string y)
    {
        X = x;
        Y = y;
    }

    public HashSet<string> GetSet()
    {
        HashSet<string> result = new HashSet<string>();
        result.Add(this.X);
        result.Add(this.Y);
        return result;
    }
}

CreateSetComparer允许字典使用集合

的值
List<Point> pointSource = GetSet();
Dictionary<HashSet<string>, Point> points = new Dictionary<HashSet<string>, Point>(HashSet<string>.CreateSetComparer());

foreach(Point d in pointSource)
{
    points.Add(d.GetSet(), d);
}

并找到一点:

HashSet<string> key = new HashSet<string>();
key.Add("X");
key.Add("Y");
Point myPoint = points[key];

这个链接可以提供帮助HashCode

答案 6 :(得分:-1)

Dictionary<string, int> dictionary =  new Dictionary<string, int>();

dictionary.Add("cat", 2);
dictionary.Add("dog", 1);
dictionary.Add("llama", 0);
dictionary.Add("iguana", -1);


if (dictionary.ContainsKey("apple"))
{
    int value = dictionary["apple"];
    Console.WriteLine(value);
}