[英]using List<customObject> as dictionary key c#
我有一本字典,其關鍵字是一個清單,如下所示
var dict = new Dictionary<List<MyKey>, Emp>(new MyCustomComparer());
我在實現列表比較器時遇到了麻煩。 即使該值存在,containskey始終返回false。 這是我寫的代碼
Program.cs
var dict = new Dictionary<List<MyKey>, Emp>(new MyCustomComparer());
var key1 = new List<MyKey>
{
{new MyKey{ Name = "string1"}}
};
dict.Add(key1, new Emp());
var key2 = new List<MyKey>
{
{new MyKey{ Name = "string1"}}
};
if (!dict.ContainsKey(key2))
{
dict.Add(key2, new Emp());
}
重點班
public class MyKey
{
public string Name { get; set; }
}
public class Emp
{
}
比較器類
public class MyCustomComparer : IEqualityComparer<List<MyKey>>
{
public bool Equals(List<MyKey> x, List<MyKey> y)
{
return x.SequenceEqual(y);
}
public int GetHashCode(List<MyKey> obj)
{
return string.Join(",", obj.Select(s => s.Name)).GetHashCode();
}
}
任何幫助都感激不盡。
問候
發布更改的代碼
var dict = new Dictionary<List<MyKey>, Emp>(new MyCustomComparer());
var key1 = new List<MyKey>
{
{new MyKey{ Name = "string1"}}
};
dict.Add(key1, new Emp());
var key2 = new List<MyKey>
{
{new MyKey{ Name = "string1"}}
};
if (!dict.ContainsKey(key2))
{
dict.Add(key2, new Emp());
}
public class MyKey
{
public string Name { get; set; }
public override int GetHashCode()
{
return Name.GetHashCode();
}
public override bool Equals(object obj)
{
var myKey = obj as MyKey;
if (myKey != null)
{
return Name == myKey.Name;
}
return false;
}
}
public class Emp
{
}
比較器類
public class MyCustomComparer : IEqualityComparer<IEnumerable<MyKey>>
{
public bool Equals(IEnumerable<MyKey> x, IEnumerable<MyKey> y)
{
return x.SequenceEqual(y);
}
public int GetHashCode(IEnumerable<MyKey> obj)
{
return string.Join(",", obj.Select(s => s.Name)).GetHashCode();
}
}
另一種方法:
public class MyCustomKey : ReadOnlyCollection<MyKey>
{
public override int GetHashCode()
{
return this.Aggregate(0, (c, i) => c + i.Name.GetHashCode()*i.Name.Length);
}
public override bool Equals(object obj)
{
var myKey = obj as MyCustomKey;
if (myKey!= null && myKey.Count == this.Count)
{
return myKey.Zip(this, (i, j) => i.Name == j.Name).All(i=>i);
}
return false;
}
}
var dict = new Dictionary<MyCustomKey, Emp>();
var key1 = new MyCustomKey(new[] {new MyKey {Name = "string1"}});
dict.Add(key1, new Emp());
var key2 = new MyCustomKey(new[] {new MyKey {Name = "string1"}});
if (!dict.ContainsKey(key2))
{
dict.Add(key2, new Emp());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.