C# 在字典中已知值时获取密钥

C# 在字典中已知值时获取密钥,c#,dictionary,C#,Dictionary,我有一个字典列表,我正在根据值搜索一个键。如何做到这一点 “someId”返回一个错误: “字典中不存在给定的密钥。” 因此,如果我给值“Ann”,那么我希望函数返回键“30” 字典里的每一项都是这样的 item 1 [0] {[someid,30]} [1] {[somename,"Ann"]} [2] {[someaddress,"3, Carl House, UK"]} private static int getmyId(字符串名称) { ... Li

我有一个字典列表,我正在根据值搜索一个键。如何做到这一点

“someId”
返回一个错误:

“字典中不存在给定的密钥。”

因此,如果我给值“Ann”,那么我希望函数返回键“30”

字典里的每一项都是这样的

    item 1
    [0] {[someid,30]}
    [1] {[somename,"Ann"]}
    [2] {[someaddress,"3, Carl House, UK"]}

private static int getmyId(字符串名称)
{
...
List myList=新列表();
foreach(myList中的字典项)
{           
if(项目包含值(名称))
{
myID=项目[“Someid”];
}
}
...
返回myID
}

从字典中的值获取密钥有点棘手,因为值可以重用。因此,您需要返回一个键列表,或者让函数只返回第一个匹配的键

这两种方法都是静态函数:

static List<string> GetKeysFromValue(Dictionary<string,string> dict, string val)
{
    if(!dict.ContainsValue(val))
        return new List<string>(); //return EMPTY list for no matching keys

    return dict.Where(kv => kv.Value.Equals(val)).Select(kv => kv.Key).ToList();
}
FirstOrDefault
将从字典中返回第一个匹配的键值对,如果没有找到,则返回
null
。由于我们已经使用
ContainsValue()
方法检查了它是否会在前面返回一些内容,因此我们可以安全地调用
Key
来获取Key属性的值


我还想指出,根据您发布的方法签名,您将您的
词典
视为
列表
。字典没有索引,因此使用用户定义的键类型。因此,没有理由返回
int
,因为没有索引。相反,您应该返回您发布的键,它是一个字符串。

您发布的函数不返回任何内容。此外,它甚至没有意义。你忘了把整件事都包括进去了吗?为什么你要做
string x=item[“SomeName”]
在所有字典中?@user1651888这看起来并不是一个解决问题的优雅方法。如果你能提供更多关于你想要达到的目标的细节,我们可以帮助你找到更好的解决方案。很好的回答和描述。我的建议:(1)GetKeysFromValue应该返回一个新的List(),而不是null;(2)GetFirstKeyFromValue应该只调用GetKeysFromValue。由于FirstOrDefault可能返回null,因此可能需要在返回.Key之前进行检查。除此之外,这可能是从一个值中获取潜在键的最简单方法。@RickDavin我把它们都写了出来,以防OP实际上不需要多个键。另外,我认为显示这两种方法比调用另一个函数来显示如何实现更有用。关于返回空列表而不是空列表:再次看,我同意。我会更新它。@b是的,不,在这种情况下它不会返回null,因为我们先检查了匹配值是否存在。我在回答中解释了这一点。但如果是那样的话,你可以先打电话。我现在只是吹毛求疵。
static List<string> GetKeysFromValue(Dictionary<string,string> dict, string val)
{
    if(!dict.ContainsValue(val))
        return new List<string>(); //return EMPTY list for no matching keys

    return dict.Where(kv => kv.Value.Equals(val)).Select(kv => kv.Key).ToList();
}
static string GetFirstKeyFromValue(Dictionary<string,string> dict, string val)
{
    if(!dict.ContainsValue(val))
        return null; //return null because nothing matched.

    return dict.FirstOrDefault(kv => kv.Value.Equals(val)).Key;
}