如何从字典中为某些键选择所有键值对

时间:2013-10-24 19:06:17

标签: c# linq dictionary

我有一个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
}

2 个答案:

答案 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,以便在没有提供复合密钥的部分时表现不同。

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

相关问题