如何将元组解构为其原始变量

本文关键字:原始 变量 元组 | 更新日期: 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<,...,>
  • 的大量数据的主要关注点。
  1. 元组没有实现索引器,但具有Item1的两个属性and Item2
  2. 你的方法使用异步,所以首先await它,然后使用结果

:

var intList = new List<int>();
var myTuple = await MyFunction(intList);
var stringList = myTuple.Item1;
intList = nmyTuple.Item2;