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

时间:2016-10-25 14:28:21

标签: c#

我正在调用一个返回元组的方法,作为不支持byval异步参数的C#异步方法的解决方法

  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

 }

2 个答案:

答案 0 :(得分:3)

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 :(得分:2)

  1. Tuple没有实现索引器,但有Item1的2个属性 和Item2
  2. 您的方法首先使用异步await,然后使用结果
  3. 所以:

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