2016-01-22 9 views
5

अभी मेरे कोड इस तरह दिखता है:सी # संग्रह प्रारंभकर्ता - क्या किसी शर्त के आधार पर वैकल्पिक रूप से तत्व जोड़ना संभव है?

var ids = projectId.HasValue ? new List<Guid> { projectId.Value } : new List<Guid>(); 

वहाँ कोड की एक पंक्ति में एक सूची बनाने का एक और अधिक संक्षिप्त तरीका है, एक तत्व के साथ वैकल्पिक जोड़ा?

+0

शायद आप सूची रैपिंग और अंदर की स्थिति के साथ जोड़ें (टी) विधि ओवरलोडिंग पर विचार करेंगे। – MaLiN2223

+7

एक ही कथन में जो शायद आप सबसे अच्छा कर सकते हैं। यदि आप ऐसा करते हैं तो आप नलिकाओं से संग्रह बनाने के लिए एक एक्सटेंशन विधि जोड़ सकते हैं। – Lee

+0

@ एक एक्सटेंशन विधि देखें, वास्तव में एक बुरा विचार की तरह नहीं लगता है। –

उत्तर

1

यह शायद एक अच्छा विचार नहीं है, लेकिन in C# 6, collection initializers also work when Add() is an extension method

इसका मतलब है आप विस्तार Add() इस प्रकार लिख सकते हैं:

public static void Add<T>(this List<T> list, T? item) where T : struct 
{ 
    if (item.HasValue) 
    { 
     list.Add(item.Value); 
    } 
} 

और फिर इस कोड को आप क्या चाहते हैं क्या करेंगे:

var list = new List<Guid> { projectId }; 

ध्यान दें कि यह केवल मूल्य प्रकार के लिए काम करेंगे (क्योंकि T/T? भेद) और संदर्भ प्रकारों के लिए इसे काम करने का कोई आसान तरीका नहीं है।

इसके अलावा, मुझे बहुत आश्चर्यजनक रेखा मिल जाएगी, और अधिक संक्षिप्त होना हमेशा बेहतर नहीं होता है। यही कारण है कि मैं वास्तव में इस कोड का उपयोग नहीं करता।

+0

धन्यवाद! और अब जब मैंने इसके बारे में सोचा है, तो आप उस छोटे से सही हैं हमेशा बेहतर नहीं होते हैं। –

+0

यदि कोई व्यक्ति जिसने मेरी कंपनी में काम किया है, तो मैं उन्हें अपने स्वयं के स्टेपलर के साथ मार दूंगा। –

+0

@ जोएनोस कह रहा है कि यह दो बार अच्छा नहीं है आपके लिए पर्याप्त नहीं है? :-) – svick

1

यह सुंदर संक्षिप्त है, लेकिन एक और विकल्प का उपयोग करने के होगा LINQ:

public static void AddIfNotNull<T>(this List<T> list, T? value) where T : struct 
{ 
    if(value != null) 
    { 
     list.Add(value.Value); 
    } 
} 

से इसे इस तरह इस्तेमाल किया जा सकता:

var ids = new[] { projectId }.Where(x => x.HasValue).Select(x => x.Value).ToList(); 
+4

यह लगभग एक ही लंबाई है और यह कोड के इरादे को छुपाता है। –

+0

@YacoubMassad प्रत्येक बाइट मायने रखता है, है ना?:) –

+0

आपने शायद 2 अक्षर सहेजे हैं, लेकिन अगर मैं एक परियोजना में यह कोड पढ़ रहा हूं, तो मुझे लगता है कि कुछ जटिल पूछताछ चल रही है। मैं मूल मंशा को समझ नहीं पाऊंगा। –

2

मैं इस इस तरह के विस्तार विधि का उपयोग कर हल होगा:

var ids = new List<Guid>(); 
ids.AddIfNotNull(projectId); 

शायद आपके प्रस्ताव के रूप में "चालाक" (और एक लाइनर नहीं) के रूप में नहीं, बल्कि मेरी राय में पढ़ने और समझने के लिए बहुत आसान है। यदि एक लाइनर के रूप में उपयोग किया जाना चाहता है तो आप सूची के रूप में एक्सटेंशन के रिटर्न प्रकार को संशोधित कर सकते हैं। यही कारण है कि यह संभव तरह var ids = new List<Guid>().AddIfNotNull(projectId);

+1

यह संकलित नहीं होगा क्योंकि 'टी'' Guid' है लेकिन 'projectId'' guid है? '। यदि आप एक विस्तार विधि बनाने जा रहे हैं तो आप वांछित व्यवहार को भी लागू कर सकते हैं यानी एक समारोह 'टी? -> सूची '। – Lee

+0

@Lee अच्छा बिंदु –

0

कुछ प्रयोग की जाने वाली आप विस्तार विधि मार्ग जा रहे हैं बनाना होगा, यह कुछ इस तरह दिखाई करना होगा:

public static void AddIfNotNull<T>(this List<T> list, T? value) 
    where T : struct 
{ 
    if (value.HasValue) 
    { 
     list.Add(value.Value); 
    } 
} 

आप एक दूसरे विस्तार विधि का निर्माण होगा संदर्भ प्रकारों के लिए (where T : class) यदि आपको आवश्यकता हो।

2

एक विस्तार विधि के लिए एक और विचार (नाम निश्चित रूप से सुधार किया जा सकता है, शायद PossiblyCreateSingletonList?):

public static class NullableExtensions 
{ 
    public static List<T> SingletonList<T>(this Nullable<T> item) where T : struct 
    { 
     return item.HasValue ? new List<T> { item.Value } : new List<T>(); 
    } 
} 

उपयोग:

Guid? projectId = null; 

List<Guid> projectIds = projectId.SingletonList(); // empty list 
संबंधित मुद्दे

 संबंधित मुद्दे