Not: Bu yanıt, C# 3 için doğru, ama bir noktada (C# 4 C 5.?) En aşağıda gösterilen IdentityFunction
yöntem rahatlıkla kullanılabilir, böylece sonuç gelişmiş yazın.
( ) Tek yapmanız gerekirdi bu yüzden, işe yaramaz çıkarım yazın ardından
public static Func<T, T> IdentityFunction<T>()
{
return x => x;
}
Ama: Bu ilk başta, jenerik olması gerekir
x => x
daha çok çirkin bir
SelectMany(Helpers.IdentityFunction<Foo>())
.
başka olasılık bir uzantı yönteminde sar şudur:
Maalesef jenerik varyans iyi C# 3 değişik vakaların faul düşebilir bu şekilde, birlikte
public static IEnumerable<T> Flatten<T>
(this IEnumerable<IEnumerable<T>> source)
{
return source.SelectMany(x => x);
}
... değil mi Örneğin, List<List<string>>
'a uygulanabilir.
public static IEnumerable<TElement> Flatten<TElement, TWrapper>
(this IEnumerable<TWrapper> source) where TWrapper : IEnumerable<TElement>
{
return source.SelectMany(x => x);
}
Ama yine, daha sonra tür kesmesi sorunlarımız var, sanıyorum ...
EDIT: Bunu daha genel yapabiliriz yorumlarla ... evet, C# 4 markaları yanıt vermek için bu daha kolay. Ya da, ilk Flatten
yöntemini C# 3'tekinden daha kullanışlı hale getirir. Burada C# 4'te çalışan bir örnek var, ancak derleyici List<List<string>>
'dan 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);
}
}
}
Neden SKI birleştiricilerini C# içine dahil etmediklerini asla anlayamayacağım. –