0

クラス IEnumerable の拡張メソッドを作成し、string.emptyではないコレクション内の最後のアイテムを取得するメソッドを作成したいと考えています。コレクションは常に配列であり、戻り値は文字列です。

null 値は空の文字列と見なします。

ジェネリックな方法でこれを行う方法がわかりません。型が文字列の配列になるので、ジェネリックメソッドにするべきなのだろうか。

この関数を次のように呼び出します。

 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 引数がコンパイラによって解決される可能性があるためです。

この行より下の更新は、より一般的なアプローチの代替ソリューションとして提供されているだけの質問に答える必要はありません

更新 - 完全に汎用的なソリューションを望んでいた 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)
                                 );
  }
}
于 2012-11-13T17:08:19.123 に答える
3

あなたが持っていると仮定するとIEnumerable<string>、あなたはただ呼び出すことができます

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

ここのように。

于 2012-11-13T17:09:29.403 に答える