我想创建一个IEnumerable类的扩展方法,并创建一个方法来检索集合中不是 string.empty 的最后一项。该集合将始终一个数组,返回的值为字符串。
我认为空值为空字符串。
我不知道如何以 generics 方式执行此操作。我想知道我是否应该将它作为通用方法,因为类型将是一个字符串数组。
我会这样调用这个函数:
string s = myArray.LastNotEmpty<???>();
我怎么能面对这个?
static class Enumerable
{
public static TSource LastNotEmpty<TSource>(this IEnumerable<TSource> source)
{
}
}
答案 0 :(得分:5)
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);
}
}
这将首先将集合过滤为string类型的集合。如果集合为null或者没有找到结果,则结果为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)
);
}
}
答案 1 :(得分:3)
假设您有IEnumerable<string>
,则可以致电
string lastNotEmpty = myIEnumerableString.Last(s => !String.IsNullOrEmpty(s));
为here。