如何在C# 7中解构作为输出参数的值元组?

18

考虑以下情况:

var dic = new Dictionary<string, (int, int)>()
{
    ["A"] = (1, 2)
};

dic.TryGetValue("A", out (int, int) value);

我可以轻松地从字典中获取value,但是如何将其解构以获取每个单独的值,就像这样:

dic.TryGetValue("A", out var (left, right));

2
如果您知道Item1是左边,Item2是右边,为什么要使用元组?使用一个更具描述性的类。 - Erik Philips
6
然后增加我们堆分配和内存使用量的十倍吗?我想我还是坚持使用值元组;你至少可以建议使用struct - MaYaN
3
除非你真的有记忆问题,否则你其实是在无谓地制造可维护性问题。 - Erik Philips
3
@ErikPhilips 这些元组并不是旧的Tuple。它们很有用,可以让事情更易于维护并提高性能。它们是结构体,这意味着没有垃圾回收。至于“除非你实际上有内存问题”,现在正在进行大量工作,以减少.NET、包、算法中的分配。如果您有一个流量适中的Web应用程序,那么您确实关心GC冻结。 - Panagiotis Kanavos
2
@MaYaN 不幸的是,SO已经充斥着非常糟糕的“具体问题”。情况变得如此糟糕,以至于在10个问题中,有9个是糟糕的或重复的。但在这种情况下,这是一种对场景不熟悉的情况。 - Panagiotis Kanavos
显示剩余4条评论
1个回答

19

dic.TryGetValue("A", out var (left, right));

这种语法目前还不支持,可能会在未来添加。 参考链接


你可以像这样为元组元素命名。

if(dic.TryGetValue("A", out (int left, int right) t))
{
    var (left, right) = (t.left, t.right);

    // use (left, right) or directly use (t.left, t.right)
}

我想不出更短的语法,这只是时间问题。C# 7 的发展比以前更快,所以你只需要等待。


10
可以使用 out var t 来缩短代码,然后再用 var (left,right)=t; 解构它。 - Panagiotis Kanavos
对,我忘了那个。 - M.kazem Akhgary
3
有了新的模式语法,您可以使用 TryGetValue("A", out var t) && t is var (left, right) 的方式实现。 - Markus Jarderot
@MarkusJarderot,我喜欢你的技巧,但是请注意,如果你正在测试!TryGetValue(当它不存在时),你将无法解构,因为&&谓词不会被评估,而且leftright将被视为未初始化。有点遗憾。 - Kirk Woll
1
@KirkWoll 你尝试过使用单个&符号吗? - M.kazem Akhgary
@M.kazemAkhgary 哦,是啊,真是个绝妙的观点;我之前没想到过。 - Kirk Woll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接