【问题标题】:How to get Key from Value in Dictionary [duplicate]如何从字典中的值中获取键[重复]
【发布时间】:2019-02-04 04:16:02
【问题描述】:

我定义了EnumDictionary如下。 现在在Dictionary,我想使用LinqValue 得到Key

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);

请建议我执行此操作的最佳方法。提前致谢

【问题讨论】:

  • 对不起,它的计数器 1, 2, 3, 4
  • 也许是个问题,为什么不用Dictionary&lt;Devices, int&gt; 代替呢? :P
  • 我正要和@VladiPavelka 说同样的话,为什么不使用设备作为密钥呢?
  • 顺便说一句。如果您没有另外指定,enum 值基本上已经是int 值(以0 开头)。我不知道密钥实际上应该代表什么,但也许您的用例很简单:int key = (int)value + 1;
  • 对于设备,我可以理解,但这是实际要求。我不能,一开始就放字典。感谢您的建议。

标签: c#


【解决方案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(和其他东西):

【讨论】:

  • 在这种情况下,“向后”字典可以简单地由 var backwards = dctDevices.ToDictionary(x =&gt; x.Value, x =&gt; x.Key); 创建,因为 OP 似乎期望严格的 1:1 关系。否则,可能需要类似的ToLookup
  • @Corak:关键是他不应该总是创建它,这就是为什么我没有显示创建但手动初始化字典一次。但是,是的,你也可以用这种方式初始化它。
  • 谢谢,第一个答案帮助了我。如果不存在则返回 -1。
【解决方案2】:

你可以这样做:

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

【讨论】:

  • 当我尝试搜索未添加到字典中的值时会出错。
  • 我编辑了我的答案,你能再试一次吗?
  • 如果 Key 不存在,它总是返回 0。但是键值0可以存在。
  • 然后你可以检查 dctDevices.ContainsValue(Devices.Television) 如果没有添加你可以返回你需要的
猜你喜欢
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2013-01-02
  • 2020-02-08
  • 1970-01-01
  • 2016-06-24
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多