static class MyEnumerable
{
public static TSource LastNotEmpty<TSource>(this IEnumerable<TSource> source) where TSource:String
{
return source.LastOrDefault(x=>!string.isNullOrEmpty(x));
}
}
またはより具体的に
static class MyEnumerable
{
public static string LastNotEmpty(this IEnumerable<string> source)
{
return source.LastOrDefault(x=>!string.isNullOrEmpty(x));
}
}
他の回答で述べたように、 Enumerable は既に System.Linq 名前空間に存在するため、ここでは静的クラスの名前が異なります。
次に、呼び出し元のコードusing
にこのクラスの名前空間があることを確認してから、使用するだけです
string s = myArray.LastNotEmpty();
s
オカレンスがない場合は null になります。
上記の呼び出しメソッドは、LastNotEmpty のいずれかの実装で使用できます。これは、GenericType 引数がコンパイラによって解決される可能性があるためです。
この行より下の更新は、より一般的なアプローチの代替ソリューションとして提供されているだけの質問に答える必要はありません
更新 - 完全に汎用的なソリューションを望んでいた Recursive を喜ばせるために。OPは、コレクションは常に文字列になるとすでに述べていますが...
static class MyEnumerable {
public static string LastNotEmpty<TSource>(this IEnumerable<TSource> source) {
if (source==null) return null; // Deals with null collection
return source.OfType<string>().LastOrDefault(x=>!string.IsNullOrEmpty(x);
}
}
これにより、最初にコレクションが文字列型のコレクションにフィルターされます。コレクションが null の場合、または結果がnull
見つからない場合は、結果が返されます。
再度更新-これは、再帰的な感じを良くするためだけのものです:)
このバージョンはTSource
、空の文字列または null のいずれとも等しくない最初のものを返します。ReferenceEquals
可能性のある値の型をnullと比較することについてresharperが不平を言うため、が使用されます...
static class MyEnumerable {
public static TSource LastNotEmpty<TSource>(this IEnumerable<TSource> source) {
if (source==null) return null; // Deals with null collection
return source.LasdtOrDefault(x=>
!ReferenceEquals(x,null)
&&
!x.Equals(String.Empty)
);
}
}