Using named tuples in select statements

五迷三道 提交于 2020-04-10 07:09:07

问题


Is there a nicer way to select a named tuple in C# 7 using a var target variable? I must be doing something wrong in example 1, or misunderstanding something completely. I seem to have to explicitly set the target type in order to do this.

//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)));

回答1:


You can just use var, but you need to make sure the tuple elements are actually named.

In C# 7.0, you need to do this explicitly:

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

In C# 7.1, when the value in a tuple literal is obtained from a property or field, that identifier will implicitly be the element name, so you'll be able to write:

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

See the feature document for more details around compatibility etc.




回答2:


Select takes 2 type parameters: Select<TSource, TResult>. A tuple (int A, int B) is only one type, you can write it also ValueTuple<int, int>. So you have to write both parameters if you want a named tuple

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


来源:https://stackoverflow.com/questions/45631769/using-named-tuples-in-select-statements

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!