我有一个Key类包含一些成员。当我只有一个关键对象的成员时,我将如何过滤字典。这是一些代码:
class Key
{
public int a { get; set; }
public int b { get; set; }
}
public class KeyEqualityComparer : IEqualityComparer<Key>
{
public int GetHashCode(Key k)
{
return (k.a + k.b).GetHashCode();
}
public bool Equals(Key lhs, Key rhs)
{
return ((lhs.a == rhs.a) && (lhs.b == rhs.b));
}
}
static Dictionary<Key, int> Data = new Dictionary<Key, int>( new KeyEqualityComparer() );
static void Main(string[] args)
{
Data.Add(new Key() { a = 0, b = 0 }, 99);
Data.Add(new Key() { a = 1, b = 0 }, 99);
// select all keys value pairs where the key contains a == 0
}
答案 0 :(得分:4)
var myPairs = Data.Where(pair => pair.Key.a == 0);
如果您要使用Key
的相同属性进行多次查找,则可以使用ToLookup
来提高效率:
var myLookup = Data.ToLookup(pair => pair.Key.a);
var myPairs = myLookup[0];
答案 1 :(得分:1)
在字典中搜索未在其IEqualityComparer
中使用该值的复合键的一部分会使字典无效。您也可以使用List
。
我建议你修改你的KeyEqualityComparer
,以便在没有提供复合密钥的部分时表现不同。
或者,如果您打算以这种方式进行多次查找并且不经常写入,则可以维护多个具有不同等式比较的字典。