एक ही मूल्य से एक नया 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.