1

我有一个包含一些成员的 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
}
4

2 回答 2

4
var myPairs = Data.Where(pair => pair.Key.a == 0);

如果您要通过 的相同属性进行多次查找Key,您可以使用它ToLookup来提高效率:

var myLookup = Data.ToLookup(pair => pair.Key.a);
var myPairs = myLookup[0];
于 2013-10-24T19:07:11.603 回答
1

在字典中搜索不使用该值的复合键的一部分会IEqualityComparer破坏字典的要点。您不妨使用List.

我建议您在未提供部分复合键时修改您KeyEqualityComparer的行为不同。

或者,如果您打算以这种方式进行多次查找并且不经常写入,您可能会维护具有不同相等比较器的多个字典。

于 2013-10-24T19:12:56.307 回答