如何将元组解构为其原始变量
本文关键字:原始 变量 元组 | 更新日期: 2023-09-27 18:14:54
我正在调用一个返回元组的方法,作为c#异步方法不支持byval异步参数的解决方案
private async Task< Tuple<List<string>, List<int>>> MyFunction(List<int> inputList){
var stringList= new List<string> ();
var intList= new List<int> ();
...
return Tuple.Create(stringList, intList);
}
要从两个项创建元组,我使用Create
方法。然而,没有一个方法可以从我调用该方法的地方返回它。
private async Task< Tuple<List<string>, List<int>>> CallTupleFunction(){
var intList = new List<int> ();
var myTuple = MyFunction(intList);
var stringList= myTuple[0]; //does not work
intList = myTuple[1]; //does not work
}
Tuple
不是一个单独的类,它是一组具有相同名称的泛型类。每个类都有一个与其项目类型相关联的类型列表,称为ItemN
。在您的情况下,您需要
var myTuple = await MyFunction(intList).ConfigureAwait(false);
// ^^^^^^^^^^^^^^^^^^^^^^
// Remove ConfigureAwait in the front end code (winforms, wpf, etc.)
var stringList= myTuple.Item1;
var intList = nmyTuple.Item2;
为了解决[]
语法,不可能提供使用索引器访问元组项的API,因为索引器唯一可能的返回类型是System.Object
。这有两个不好的原因:
- 检索元组的元素需要强制转换—您必须编写
var stringList= (List<string>)myTuple[0]
,这首先违背了使用元组的目的。 - 检索值类型元素将需要装箱—这将是处理存储为
Tuple<,...,>
的大量数据的主要关注点。
- 元组没有实现索引器,但具有
Item1
的两个属性andItem2
- 你的方法使用异步,所以首先
await
它,然后使用结果
:
var intList = new List<int>();
var myTuple = await MyFunction(intList);
var stringList = myTuple.Item1;
intList = nmyTuple.Item2;