如何从字典中的值中获取密钥

时间:2018-08-29 11:25:32

标签: c#

我已如下定义EnumDictionary。 现在在Dictionary中,我想使用Key

Value中获取Linq
enum Devices
    {
        Fan,
        Bulb,
        Mobile,
        Television
    };

Dictionary<int, Devices> dctDevices = new Dictionary<int, Devices>()
{
    {1, Devices.Fan},
    {2, Devices.Bulb},
    {3, Devices.Mobile},
    {4, Devices.Television}
};

我想要如下结果。我需要下面的具体方法。

int key = GetKeyFromValue(Devices.Bulb);

请建议我执行此操作的最佳方法。预先感谢

2 个答案:

答案 0 :(得分:1)

该方法可能类似于:

int GetKeyFromValue(Devices device)
{
    return dctDevices.Keys
        .Where(k => dctDevices[k] == device)
        .DefaultIfEmpty( -1 ) // or whatever "not found"-value
        .First();
}

或任何类型的通用扩展方法:

public static TKey GetKeyByBalue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TValue value, TKey notFoundKey, IEqualityComparer<TValue> comparer = null)
{
    if (comparer == null)
        comparer = EqualityComparer<TValue>.Default;
    return dict.Keys.Where(k => comparer.Equals(dict[k], value)).DefaultIfEmpty(notFoundKey).First();
}

请注意,如果您想经常查找该值,则应该使用其他字典:

Dictionary<Devices, int> DeviceKeys = new Dictionary<Devices, int>()
{
    {Devices.Fan, 1}, // ...
};

然后,代码变得更加高效:

int key = DeviceKeys[Devices.Bulb];

或创建一个自定义类Device,该类封装了ID和Devices(及其他内容):

答案 1 :(得分:-1)

您可以按照以下方式进行操作:

dctDevices.AsEnumerable().Where(p => p.Value == Devices.Bulb).FirstOrDefault().Key;