我如何得到一个字典键值在c# ?
Dictionary<string, string> types = new Dictionary<string, string>()
{
{"1", "one"},
{"2", "two"},
{"3", "three"}
};
我想要这样的东西:
getByValueKey(string value);
getByValueKey("one")必须返回"1"。
最好的方法是什么?也许是哈希表或排序列表?
我如何得到一个字典键值在c# ?
Dictionary<string, string> types = new Dictionary<string, string>()
{
{"1", "one"},
{"2", "two"},
{"3", "three"}
};
我想要这样的东西:
getByValueKey(string value);
getByValueKey("one")必须返回"1"。
最好的方法是什么?也许是哈希表或排序列表?
当前回答
public static string GetKeyFromValue(string valueVar)
{
foreach (string keyVar in dictionaryVar.Keys)
{
if (dictionaryVar[keyVar] == valueVar)
{
return keyVar;
}
}
return null;
}
其他人可能有更有效的答案,但我个人觉得这个更直观,对我来说很管用。
其他回答
keys中的键的顺序是未指定的,但它与values中的相关值相同(来自c#文档)。
因此,(在某些情况下)对值的集合执行此操作的有效方法如下:
/// <summary>
/// Gets the 1st key matching each value
/// </summary>
public static IEnumerable<TKey> GetKeys<TKey,TValue>(this Dictionary<TKey, TValue> dic, IEnumerable<TValue> values) where TKey : notnull
{
//The order of the keys in Keys is unspecified, but it is the same as the associated values in Values
var dicKeys = dic.Keys.ToList();
var dicValues = dic.Values.ToList();
foreach (var value in values)
{
var i = dicValues.IndexOf(value); //Will return the index of the 1st found value, even when multiple values are present
//we could test if i==-1 there.
yield return dicKeys[i];
}
}
types.Values.ToList().IndexOf("one");
values . tolist()将您的字典值转换为对象列表。 IndexOf("one")搜索你的新列表,寻找"one",并返回与字典中Key/Value对的索引匹配的Index。
这个方法并不关心字典中的键,它只是返回您正在寻找的值的索引。
请记住,在你的字典中可能有不止一个“1”值。这就是没有“get key”方法的原因。
值不一定是唯一的,所以必须进行查找。你可以这样做:
var myKey = types.FirstOrDefault(x => x.Value == "one").Key;
如果值是唯一的,并且插入的频率低于读取,那么创建一个反向字典,其中值是键,键是值。
也许是这样的:
foreach (var keyvaluepair in dict)
{
if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject))
{
//dict.Remove(keyvaluepair.Key);
break;
}
}
下面的代码只在包含唯一值数据时有效:
public string getKey(string Value)
{
if (dictionary.ContainsValue(Value))
{
var ListValueData = new List<string>();
var ListKeyData = new List<string>();
var Values = dictionary.Values;
var Keys = dictionary.Keys;
foreach (var item in Values)
{
ListValueData.Add(item);
}
var ValueIndex = ListValueData.IndexOf(Value);
foreach (var item in Keys)
{
ListKeyData.Add(item);
}
return ListKeyData[ValueIndex];
}
return string.Empty;
}