在 select 语句中使用命名元组

Using named tuples in select statements

有没有更好的方法使用 var 目标变量 select C# 7 中的命名元组?我一定在示例 1 中做错了什么,或者完全误解了某些东西。我似乎必须明确设置目标类型才能执行此操作。

//1. Fails to compile with "incorrect number of type parameters" issue.
var tuples = source.Select<(int A, int B)>(x => (x.A, x.B));

//2. Compiles
IEnumerable<(int A, int B)> tuples = toCheck.Select(x => (x.A, x.B));

//3. Compiles
var tuples = new HashSet<(int A, int B)>(source.Select(x => (x.A, x.B)));

Select 接受 2 个类型参数:Select<TSource, TResult>。一个元组(int A, int B)只是一种类型,你也可以写成ValueTuple<int, int>。所以如果你想要一个命名元组,你必须写两个参数

var tuples = source.Select<TypeOfSource, (int A, int B)>(x => (x.A, x.B));

您可以只使用 var,但您需要确保元组元素确实已命名。

在 C# 7.0 中,您需要明确执行此操作:

var tuples = source.Select(x => (A: x.A, B: x.B));
foreach (var tuple in tuples)
{
    Console.WriteLine($"{tuple.A} / {tuple.B}");
}

在 C# 7.1 中,当从 属性 或字段中获取元组文字中的值时,该标识符将隐式为元素名称,因此您可以编写:

var tuples = source.Select(x => (x.A, x.B));
foreach (var tuple in tuples)
{
    Console.WriteLine($"{tuple.A} / {tuple.B}");
}

有关兼容性等方面的更多详细信息,请参阅 feature document