2017-08-11 48 views
9

有沒有更好的方法在C#7中使用var目標變量選擇命名元組?我必須在例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))); 

回答

11

你可以使用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}"); 
} 

周邊的兼容性的詳細信息等

+0

太好了,我不知道你能嵌入名字中的元素見feature document在這樣的聲明裏面的元組中。 – gmn

+0

出於好奇,爲什麼不是匿名類型中的''A = x.A''? ''var x = new {A = x.A,B = x.B};'' –

+0

@RandRandom:這不是元組元素名稱的語法。它在聲明和元組文字中都是一致的':'。匿名類型更像是對象初始化器,「設置」屬性(儘管類型實際上是不可變的)。 –

-1

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