本文介绍了C#泛型字典TryGetValue没有找到钥匙的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个简单的例子:
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Dictionary<MyKey, string> data = new Dictionary<MyKey, string>();
data.Add(new MyKey("1", "A"), "value 1A");
data.Add(new MyKey("2", "A"), "value 2A");
data.Add(new MyKey("1", "Z"), "value 1Z");
data.Add(new MyKey("3", "A"), "value 3A");
string myValue;
if (data.TryGetValue(new MyKey("1", "A"), out myValue))
Console.WriteLine("I have found it: {0}", myValue );
}
}
public struct MyKey
{
private string row;
private string col;
public string Row { get { return row; } set { row = value; } }
public string Column { get { return col; } set { col = value; } }
public MyKey(string r, string c)
{
row = r;
col = c;
}
}
}
这是工作的罚款。但是,如果我用的myKey类改变的myKey结构是这样的:
This is working fine. But if I change the MyKey struct by a MyKey class in this way:
public class MyKey
则方法 TryGetValue
没有找到尽管关键的关键是出那里。
Then method TryGetValue
doesn't find any key in spite of the key is out there.
我相信我缺少明显的东西,但我不知道是什么。
I am sure I am missing something obvious but I don't know what.
任何想法?
感谢
(请参见更好的GetHashCode分辨率接受的解决方案)的
(please, see accepted solution for better GetHashCode resolution)
我已经重新定义了这样的myKey类,所有目前工作正常:
I have redefined MyKey class like this, and all is working fine now:
public class MyKey
{
private string row;
private string col;
public string Row { get { return row; } set { row = value; } }
public string Column { get { return col; } set { col = value; } }
public MyKey(string r, string c)
{
row = r;
col = c;
}
public override bool Equals(object obj)
{
if (obj == null || !(obj is MyKey)) return false;
return ((MyKey)obj).Row == this.Row && ((MyKey)obj).Column == this.Column;
}
public override int GetHashCode()
{
return (this.Row + this.Column).GetHashCode();
}
}
感谢所有的人回答了这一点。
Thanks to all people answered this.
推荐答案
您需要重写等于()
和的GetHashCode( )
在类的myKey
也许是这样的:
的GetHashCode()
public override int GetHashCode()
{
return GetHashCodeInternal(Row.GetHashCode(),Column.GetHashCode());
}
//this function should be move so you can reuse it
private static int GetHashCodeInternal(int key1, int key2)
{
unchecked
{
//Seed
var num = 0x7e53a269;
//Key 1
num = (-1521134295 * num) + key1;
num += (num << 10);
num ^= (num >> 6);
//Key 2
num = ((-1521134295 * num) + key2);
num += (num << 10);
num ^= (num >> 6);
return num;
}
}
等于
public override bool Equals(object obj)
{
if (obj == null)
return false;
MyKey p = obj as MyKey;
if (p == null)
return false;
// Return true if the fields match:
return (Row == p.Row) && (Column == p.Column);
}
这篇关于C#泛型字典TryGetValue没有找到钥匙的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!