使用列表<T>解构



有没有办法允许元组列表将其解构为 List<T>

我在以下代码示例中获取以下编译错误:

无法隐式转换类型'System.Collections.generic.list&lt;deconstruct.test>'to'system.collections.generic.list&lt;(int,int(>'

using System;
using System.Collections.Generic;
namespace Deconstruct
{
    class Test
    {
        public int A { get; set; } = 0;
        public int B { get; set; } = 0;
        public void Deconstruct(out int a, out int b)
        {
            a = this.A;
            b = this.B;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var test = new Test();
            var (a, b) = test;
            var testList = new List<Test>();
            var tupleList = new List<(int, int)>();
            tupleList = testList; // ERROR HERE....
        }
    }
}

您需要明确将testList(List<Test>(转换为tupleList(List<(int, int)>(

tupleList = testList.Select(t => (t.A, t.B)).ToList();

说明:

您正在使用代码,就好像Deconstruct允许您将实现Deconstruct的类转换为元组(ValueTuple(,但这不是Deconstruct剂量。

从文档解构元组和其他类型的文档中:

从C#7.0开始,您可以从元组中检索多个元素 或从一个从一个字段,属性和计算值中检索 单个解构操作中的对象。当您解构一个 元组,将其元素分配给单个变量。当你 解构对象,您将所选值分配给个体 变量

解构将多个元素返回到单个变量,而不是元组(ValueTuple(。

尝试将List<Test>转换为List<(int, int)>

var testList = new List<Test>();
var tupleList = new List<(int, int)>();
tupleList = testList;

无法工作,因为您无法将List<Test>转换为List<(int, int)>。它将生成编译器错误:

无法隐式将类型'System.Collections.generic.list'转换为'System.Collections.generic.list&lt;(int,int(>'

试图将每个Test元素施放到这样的(int, int)

tupleList = testList.Cast<(int, int)>().ToList();

无法正常工作,因为您无法将Test施加到(int, int)。它将生成运行时错误:

system.invalidcastException:"指定的铸件无效。"

尝试将单个Test元素转换为(int, int)

(int, int) tuple = test;

无法工作,因为您不能将Test转换为(int, int)。它将生成编译器错误:

不能将类型的'deconstruct.test'转换为'(int,int('

相关内容

  • 没有找到相关文章

最新更新