0

我想创建一个类 IEnumerable 的扩展方法,并创建一个方法来检索集合中不是string.empty的最后一项。集合将始终是一个数组,返回值是一个字符串。

我认为空值是一个空字符串。

我不知道如何以泛型方式做到这一点。我想知道是否应该将其设为通用方法,因为该类型将是字符串数组。

我会这样调用这个函数:

 string s = myArray.LastNotEmpty<???>();

我该如何面对?

static class Enumerable
{
    public static TSource LastNotEmpty<TSource>(this IEnumerable<TSource> source)
    {

    }
}
4

2 回答 2

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);
  }
}

这将首先将集合过滤为字符串类型的集合。结果将是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)
                                 );
  }
}
于 2012-11-13T17:08:19.123 回答
3

假设你有一个IEnumerable<string>,你可以打电话

string lastNotEmpty = myIEnumerableString.Last(s => !String.IsNullOrEmpty(s));

就像这里一样。

于 2012-11-13T17:09:29.403 回答