क्या किसी प्रकार की एकल वस्तु T
को एक विधि से पारित करने का एक सामान्य तरीका है जो एक IEnumerable<T>
पैरामीटर की अपेक्षा करता है? भाषा C #, फ्रेमवर्क संस्करण 2.0 है।
वर्तमान में मैं एक सहायक विधि का उपयोग कर रहा हूँ (यह .Net 2.0 है, इसलिए मेरे पास LINQ के समान सहायक विधियों की कास्टिंग / प्रोजेक्ट करने का एक पूरा गुच्छा है), लेकिन यह सिर्फ मूर्खतापूर्ण लगता है:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
अन्य तरीका निश्चित रूप से एक List<T>
या एक को बनाना और पॉप्युलेट Array
करना होगा और इसके बजाय इसे पास करना होगा IEnumerable<T>
।
[संपादित करें] एक विस्तार विधि के रूप में इसका नाम हो सकता है:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
क्या मुझसे कोई चूक हो रही है?
[Edit2] हमने पाया someObject.Yield()
(जैसा कि @Peter ने नीचे टिप्पणी में सुझाया है) इस विस्तार पद्धति का सबसे अच्छा नाम होना, मुख्य रूप से संक्षिप्तता के लिए, इसलिए यहाँ XML टिप्पणी के साथ है अगर कोई इसे हथियाना चाहता है:
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// consisting of a single item.
/// </summary>
/// <typeparam name="T"> Type of the object. </typeparam>
/// <param name="item"> The instance that will be wrapped. </param>
/// <returns> An IEnumerable<T> consisting of a single item. </returns>
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
}
AsEnumerable
क्योंकि उस नाम के साथ एक अंतर्निहित एक्सटेंशन पहले से मौजूद है । (जब T
लागू होता है IEnumerable
, उदा string
।)
Yield
? कुछ भी नहीं संक्षिप्तता धड़कता है।
left==null
यहां चैक से नफरत है। यह कोड की सुंदरियों को तोड़ता है और कोड को अधिक लचीले होने से रोकता है - क्या होगा अगर किसी दिन आप किसी एकल के साथ एक सिंगलटन उत्पन्न करने की आवश्यकता है जो अशक्त हो सकता है? मेरा मतलब है, new T[] { null }
जैसा है वैसा नहीं है new T[] {}
, और किसी दिन आपको उन्हें अलग करने की आवश्यकता हो सकती है।
if (item == null) yield break;
अब आपको अशक्त होने से रोकने के साथ-साथ (तुच्छ) अशक्त वस्तु पैटर्न का लाभ लेना बंद कर दिया जाएगाIEnumerable
। (foreach (var x in xs)
एक खालीxs
ठीक संभालती है)। संयोग से, यह फ़ंक्शन उस सूची के लिए monadic इकाई है जो कि monad हैIEnumerable<T>
, और Microsoft में monad love-उत्सव को देखते हुए मुझे आश्चर्य है कि यह कुछ इस तरह से पहली जगह में नहीं है।