2017-08-11 22 views
9

क्या एक var target चर का उपयोग कर सी # 7 में नामित टुपल का चयन करने का एक अच्छा तरीका है? मुझे उदाहरण 1 में कुछ गलत करना होगा, या पूरी तरह से कुछ गलत समझना होगा। ऐसा करने के लिए मुझे स्पष्ट रूप से लक्ष्य प्रकार निर्धारित करना होगा।चुनिंदा वक्तव्यों में नामित tuples का उपयोग

//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 उपयोग कर सकते हैं, लेकिन क्या आप वाकई टपल तत्वों वास्तव में नाम हैं बनाने की जरूरत है।

सी # 7.0 में, आप इस स्पष्ट रूप से करने की जरूरत है:

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

सी # 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 देखें: तो तुम लिखने के लिए सक्षम हो जाएगा इस तरह की घोषणा के अंदर tuple में। – gmn

+0

जिज्ञासा से, यह अज्ञात प्रकारों में 'ए = x.A'' क्यों नहीं है? 'var x = new {ए = x.A, बी = x.B};' ' –

+0

@RandRandom: यह सिर्फ tuple तत्व नामों के लिए वाक्यविन्यास नहीं है। यह दोनों घोषणाओं और ट्यूपल लिटल में लगातार '' 'है। बेनामी प्रकार ऑब्जेक्ट प्रारंभकर्ताओं, "सेटिंग" गुणों की तरह अधिक हैं (हालांकि प्रकार वास्तव में अपरिवर्तनीय हैं) –

-1

Select लेता है 2 प्रकार पैरामीटर: Select<TSource, TResult>। एक tuple (int A, int B) केवल एक ही प्रकार है, आप इसे ValueTuple<int, int> भी लिख सकते हैं। तो तुम दोनों मानकों लिखने के लिए आप एक नामित टपल चाहते हैं

var tuples = source.Select<TypeOfSource, (int A, int B)>(x => (x.A, x.B)); 
संबंधित मुद्दे