C# 可以从一个元组初始化多个变量吗?
在某些语言(如PHP、Haskell或Scala)中,可以通过类似于以下伪代码的方式从元组分配多个变量:C# 可以从一个元组初始化多个变量吗?,c#,tuples,C#,Tuples,在某些语言(如PHP、Haskell或Scala)中,可以通过类似于以下伪代码的方式从元组分配多个变量: list(string value1, string value2) = tupleWithTwoValues; 但是,如果不编写更长、更难看的代码,我无法在C中找到这样做的方法: string firstValue = tupleWithTwoValues.Item1; string secondValue = tupleWithTwoValues.Item2; 这种两行解决方案显然不
list(string value1, string value2) = tupleWithTwoValues;
但是,如果不编写更长、更难看的代码,我无法在C中找到这样做的方法:
string firstValue = tupleWithTwoValues.Item1;
string secondValue = tupleWithTwoValues.Item2;
这种两行解决方案显然不是世界末日,但我一直在寻找编写更漂亮代码的方法
有人知道更好的方法吗?从技术上讲,您可以使用以下语法使用一条语句而不是两条语句来实现这一点,尽管字符数几乎相同
string firstValue = tupleWithTwoValues.Item1
, secondValue = tupleWithTwoValues.Item2;
有效期至C 6:
不,这是不可能的。C语言中没有这样的语言特性
如果您认为以下代码:
string firstValue = tupleWithTwoValues.Item1;
string secondValue = tupleWithTwoValues.Item2;
如果是丑陋的,那么首先应该重新考虑使用元组
更新:从C7开始,元组解构现在是可能的。有关更多信息,请参阅
也请参见Jared的。不,这在C语言中不受支持,尽管其他人建议添加这样的功能和 它由F支持,但是:
let (f, b) = ("foo", "bar")
对于列表,您可以执行以下操作:
var list = new List<string>{tuple.Item1, tuple.Item2};
没那么罗嗦
但是对于多个变量,不行。你不能这样做。我就是这么做的:
public static TResult Select<T1, T2, TResult>(this Tuple<T1, T2> source, Func<T1, T2, TResult> selector)
{
return selector(source.Item1, source.Item2);
}
// this allows us ...
GetAssociationAndMember().Select((associationId,memberId) => {
// do things with the aptly named variables
});
这在C7中现在可用:
public (string first, string last) FullName()
{
return ("Rince", "Wind");
}
(var first, var last) = FullName();
您甚至可以使用单个var声明:
var (first, last) = FullName();
更多关于解构元组的信息,请参见。是的,在C中这是可能的。
您需要在项目中安装包Value.Tuple。
你可以这样做
List<Tuple<string,string>>() lstTuple = GetYourTupleValue();
foreach(var item in lstTuple)
{
(string Value1, string Value2 ) = item;
}
Console.WriteLine(item.Value1);
不能从元组初始化多个变量。是的,元组是丑陋的C@HighCore讨厌的人会讨厌的。虽然公平地说,我可能可以通过提到Ruby而不是PHP来避免这样的尖刻:另请看这个重复的问题:我要补充的是,在C语言中移动东西并不是经常做的事情。除非你想给这个东西起一个较短的名字,并在代码中多次使用它,您可能会直接访问tupleWithTwoValues.Item1,而不是将其放入variable.True中。发布后几秒钟,我突然意识到,每当我考虑元组时,像DTO这样更丰富的解决方案往往是最好的选择。@Micah是的,包括语义总是一个加号。元组通常只在非常特定的场景中才是一件好事。这在C:@Jared中现在可用。谢谢你指出这一点。更新了我的答案,尽管在2014年,该语言功能还不存在。它现在以C语言提供: