如果值是元组,如何通过 .TryGetValue() 从字典中读取值?

Ola*_*son 11 c#

我有一个类型的字典

Dictionary<int, (float, float)>
Run Code Online (Sandbox Code Playgroud)

尝试从中读取值时,我无法使用这种方式

if (myDict.TryGetValue(1, out (float tupleItem1, float tupleItem2))) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

因为那样我会收到编译错误

在此处输入图片说明

它的工作方式是

if (myDict.TryGetValue(1, out (float, float) theTuple)) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

有没有办法可以像这样直接初始化变量?

if (!myDict.TryGetValue(1, out (float tupleItem1, float tupleItem2)))
{
    /* handle if not found */
    tupleItem1 = 111;
    tupleItem2 = -12345;
}
Run Code Online (Sandbox Code Playgroud)

can*_*on7 8

out不幸的是,您不能直接在参数中解构,请参阅此建议

你必须自己解构它:

if (!myDict.TryGetValue(1, out var result))
{
    result = (111, -12345);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用扩展方法稍微改善这种情况:

public static class DictionaryExtensions
{
    public static TValue? TryGetValue<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key) where TValue : struct
    {
        return dict.TryGetValue(key, out var result) ? result : null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这让你写:

if (myDict.TryGetValue(1) is not (float tupleItem1, float tupleItem2))
{
    tupleItem1 = 111;
    tupleItem2 = -12345;
}
Run Code Online (Sandbox Code Playgroud)