2010-05-05 22 views
8

मैं इस विधि (सरलीकृत) है:एक पद्धति के लिए एक खाली IEnumerable तर्क पासिंग

void DoSomething(IEnumerable<int> numbers); 

और मैं इसे इस तरह आह्वान:

DoSomething(condition==true?results:new List<int>()); 

चर results एक LINQ हालत चयन के साथ बनाई है (IEnumerable)।

मुझे आश्चर्य था कि यह List<int>() खाली संग्रह पास करने के लिए सबसे अच्छा तरीका (सबसे तेज़?) है, या new int[0] बेहतर है? या, कुछ और तेज होगा, Collection, आदि? मेरे उदाहरण में null ठीक नहीं होगा।

उत्तर

27

मैं प्रयोग करेंगे Enumerable.Empty<int>()

DoSometing(condition ? results : Enumerable.Empty<int>()); 
+0

अच्छा लगा। मैंने आज कुछ सीखा है! – spender

+0

+1। Enumerable.Empty – AlwaysAProgrammer

+0

से अनजान था है कि मैं वास्तव में क्या देख रहा था! – avance70

1

@ avance70। वास्तव में मूल प्रश्न का उत्तर नहीं है, लेकिन केवल 1 पूर्णांक मान के साथ एक आईनेमरेबल के बारे में avance70 के प्रश्न का उत्तर। इसे एक टिप्पणी के रूप में जोड़ा होगा, लेकिन मेरे पास कोई टिप्पणी जोड़ने के लिए पर्याप्त प्रतिनिधि नहीं है। यदि आप एक सख्ती से अपरिवर्तनीय अनुक्रम में रुचि रखते हैं, तो आप विकल्पों में से एक जोड़ी है:

जेनेरिक विस्तार विधि:

public static IEnumerable<T> ToEnumerable<T>(this T item) 
{ 
    yield return item; 
} 

उपयोग इस तरह:

foreach (int i in 10.ToEnumerable()) 
{ 
    Debug.WriteLine(i); //Will print "10" to output window 
} 

या इस:

int x = 10; 
foreach (int i in x.ToEnumerable()) 
{ 
    Debug.WriteLine(i); //Will print value of i to output window 
} 

या इस:

int start = 0; 
int end = 100; 
IEnumerable<int> seq = GetRandomNumbersBetweenOneAndNinetyNineInclusive(); 

foreach (int i in start.ToEnumerable().Concat(seq).Concat(end.ToEnumerable())) 
{ 
    //Do something with the random numbers, bookended by 0 and 100 
} 

मुझे हाल ही में उपरोक्त प्रारंभ/समाप्ति उदाहरण जैसा मामला था जहां मुझे अनुक्रम से लगातार मूल्य निकालना था (छोड़ें और टेक का उपयोग करके) और फिर प्रारंभ और अंत मूल्यों को प्रीपेन्ड और संलग्न करें। आरंभ और अंत मान पिछले नहीं-निकाले मूल्य और पहले निकाले मूल्य (शुरू करने के लिए) के बीच है और पिछले निकाले मूल्य और पहली गैर निकाले मूल्य (अंत के लिए) के बीच अंतर्वेशित रहे थे। परिणामस्वरूप अनुक्रम को फिर से संचालित किया गया था, संभवतः उलट रहा था।

तो, अगर मूल अनुक्रम की तरह देखा:

:

मैं 3 और 4 निकालने और 2 और 3 और 4 और 5 के बीच अंतर्वेशित मान जोड़ने के लिए हो सकता है 2,5 3 4 4,5

Enumerable.Repeat। इस तरह का उपयोग करें:

foreach (int i in Enumerable.Repeat(10,1)) //Repeat "10" 1 time. 
{ 
    DoSomethingWithIt(i); 
} 
बेशक

, क्योंकि ये IEnumerables रहे हैं, वे भी अन्य IEnumerable कार्यों के साथ संयोजन के रूप में इस्तेमाल किया जा सकता। सुनिश्चित नहीं है कि ये वास्तव में "अच्छे" विचार हैं या नहीं, लेकिन उन्हें नौकरी मिलनी चाहिए।

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