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 参数。
此行下方的更新不需要回答问题,它们只是作为更通用方法的替代解决方案提供
更新 - 只是为了取悦想要一个完全通用的解决方案的递归。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
如果集合为空或没有找到结果..
再次更新 - 这只是为了尝试让递归感觉良好:)
此版本将返回TSource
不等于空字符串或 null 的第一个。之所以使用,ReferenceEquals
是因为 resharper 抱怨将可能的值类型与 null 进行比较...
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)
);
}
}