नोट: इस उत्तर के लिए सी # 3 सही था, लेकिन कुछ बिंदु (सी # 4 सी # 5?) पर अनुमान में सुधार इतना है कि IdentityFunction
विधि नीचे दिखाया गया आसानी से इस्तेमाल किया जा सकता टाइप करें।
नहीं, ऐसा नहीं है। ,
public static Func<T, T> IdentityFunction<T>()
{
return x => x;
}
लेकिन तब अनुमान टाइप कार्य नहीं करेगा तो आपको बस इतना करना होगा:: यह साथ शुरू करने के लिए, सामान्य होने के लिए होता है
SelectMany(Helpers.IdentityFunction<Foo>())
जो x => x
की तुलना में बहुत भद्दा है।
एक और संभावना है कि आप एक विस्तार विधि में इस लपेट है:
public static IEnumerable<T> Flatten<T>
(this IEnumerable<IEnumerable<T>> source)
{
return source.SelectMany(x => x);
}
सामान्य विचरण जिस तरह से यह है, कि अच्छी तरह से # 3 सी में विभिन्न मामलों की बेईमानी से गिर सकता है के साथ दुर्भाग्य से ... ऐसा नहीं है उदाहरण के लिए List<List<string>>
पर लागू हों। आप इसे अधिक सामान्य बना सकता है:
public static IEnumerable<TElement> Flatten<TElement, TWrapper>
(this IEnumerable<TWrapper> source) where TWrapper : IEnumerable<TElement>
{
return source.SelectMany(x => x);
}
लेकिन फिर, आप तो प्रकार निष्कर्ष समस्याओं मिल गया है, मुझे लगता है ...
संपादित करें: टिप्पणी ... हाँ, सी # 4 बनाता है पर प्रतिक्रिया देने के यह आसान है। या बल्कि, यह अधिक उपयोगी तुलना में यह सी # 3. में है पहले Flatten
विधि यहाँ एक उदाहरण है जो सी # 4 में काम करता है, लेकिन में काम नहीं करता सी # 3 क्योंकि संकलक से परिवर्तित नहीं कर सकते बनाता List<List<string>>
IEnumerable<IEnumerable<string>>
रहे हैं:
using System;
using System.Collections.Generic;
using System.Linq;
public static class Extensions
{
public static IEnumerable<T> Flatten<T>
(this IEnumerable<IEnumerable<T>> source)
{
return source.SelectMany(x => x);
}
}
class Test
{
static void Main()
{
List<List<string>> strings = new List<List<string>>
{
new List<string> { "x", "y", "z" },
new List<string> { "0", "1", "2" }
};
foreach (string x in strings.Flatten())
{
Console.WriteLine(x);
}
}
}
मैं कभी नहीं समझूंगा कि क्यों वे एसकेआई संयोजक को सी # में शामिल नहीं करते हैं। –