एक ही मूल्य से एक नया IEnumerable <T> अनुक्रम बनाने का पसंदीदा तरीका?


97

मैं आमतौर पर सरणी सिंटैक्स का उपयोग करके एकल मान से एक अनुक्रम बनाता हूं, जैसे:

IEnumerable<string> sequence = new string[] { "abc" };

या एक नई सूची का उपयोग कर। अगर किसी के पास एक ही काम करने के लिए अधिक अभिव्यंजक तरीका है, तो मैं सुनना चाहता हूं।


3
वह खाली क्रम कैसा है?
— कोडरडेन

यह शर्मनाक है कि डॉटनेट के पास अभी भी कुछ ऐसा नहीं है Enumerable.From<T>(params T[] items)।
— गुड नाइट नर्ड प्राइड

जवाबों:


144

आपका उदाहरण एक खाली अनुक्रम नहीं है, यह एक तत्व के साथ एक अनुक्रम है। तार का एक खाली क्रम बनाने के लिए आप कर सकते हैं

var sequence = Enumerable.Empty<string>();

EDIT ओपी ने स्पष्ट किया कि वे एकल मूल्य बनाना चाहते हैं। उस स्तिथि में

var sequence = Enumerable.Repeat("abc",1);

डी'ओह, मैं विचलित हो गया, क्षमा करें। मेरा मतलब एकल मूल्य से है, खाली उदाहरण नहीं बनाना है!
— मार्सेल लमोटे

यह 'उत्तर' है इसे ध्वजांकित करें?
— n8wrl

यह विधि एक नई सरणी बनाने की तुलना में अधिक विशुद्ध रूप से कार्यात्मक है।
— रॉय टिंकर

69

मुझे पसंद है कि आप क्या सुझाव देते हैं, लेकिन सरणी प्रकार छोड़ा गया है:

var sequence = new[] { "abc" };

4
मुझे कभी नहीं लगा कि आप ऐसा कर सकते हैं। मुझे लगता है कि यह दोहराने का उपयोग करने की तुलना में स्पष्ट है।
— मार्सेल लैमोटे

1
लेकिन यह एक IEnumerable नहीं है, यह एक सरणी है!
— राशि

4
@ ब्रायन वत्स मुझे पता है कि, लेकिन यह एक IEnumerable का एक ठोस कार्यान्वयन है। प्रश्न IEnumerable <> (भले ही उदाहरण न हो) के लिए पूछ रहा है। एक अंतर है।
— 22

शायद सवाल को बदल दिया जाए।
— राशि

1
@ जोनासोपोलिस: यह एक अलग, असंबंधित स्थिति है। आप इसे Task.FromResultप्राप्त करने के लिए उपयोग कर सकते हैं ।
— ब्रायन वत्स

21

या उससे भी छोटा,

string[] single = { "abc" };

मैं एक विस्तार विधि बनाऊंगा:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

या इससे भी बेहतर और छोटा, बस

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

शायद यह वही है जो Enumerable.Repeatहुड के तहत कर रहा है।


1
आखिरी शानदार है। नाम को छोड़कर ... यह उन प्रकारों के साथ संघर्ष करेगा जो पहले से ही IEnumerable को लागू करते हैं जैसे कि आपके उदाहरण में स्ट्रिंग। > "Abc" .Yield () - .AsSingleItemEnumerable (), या बस .Yield () की कोशिश करो
— Dano

8
मुझे लगता है कि ToEnumerable अधिक उपयुक्त है।
— राशि

2
+1 Yieldअच्छा है। मैंने IEnumerable<T> Yield<T>(this T source, params T[] others)भी बनाया ।
— जॉडरेल

मैंने यील्ड के साथ पूरी तरह से एक मेमने के पक्ष में करने की कोशिश की, लेकिन किसी तरह इसे कभी संकलित नहीं किया ... सीएफ। stackoverflow.com/questions/1217729/… ;-)।
— पीटर - मोनिका

@PeterSchneider आपने ऐसा क्यों और कैसे किया? कोड देखे बिना मैं टिप्पणी नहीं कर सकता। मुझे नहीं लगता कि मैं आपका अनुसरण करता हूं।
— नवफल

5

या बस एक विधि बनाएँ

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

या

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

उपयोग:

IEnumerable<string> items = CreateEnumerable("single");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.