在C#中,我希望有一个将(x,y)坐标映射到(x,y)的数据结构。我怎么能这样做?
我不想使用像y*w+x
之类的公式将x,y坐标转换为单个值。有没有办法dictionary<key,key,(value,value)>
。
如果我把密钥作为元组,那么它的一个对象和元组(1,1)不等于元组(1,1)。所以我不认为我能在这个意义上找到钥匙。
答案 0 :(得分:2)
您不能只定义(或使用System.Drawing
命名空间中的pre-existing structure)Point
作为保存(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);
}