2012-11-13 30 views
0

我想創建一個類IEnumerable的擴展方法,並創建一個方法來檢索集合中最後一個不是string.empty。收集將是總是一個數組並返回一個字符串值。擴展IEnumerable:如何返回最後一個不是string.empty元素?

我認爲空值是一個空字符串。

我不知道如何做到這一點在泛型的方式。我想知道是否應該使它成爲泛型方法,因爲該類型將是一個字符串數組。

我會調用這個函數是這樣的:

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

我如何面對呢?

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

    } 
} 
+7

如果不是一串字符串,你會期望這樣做嗎? –

+0

它將始終是一個字符串數組。我想知道我是否應該將其作爲一種通用的方法。 – anmarti

+2

@senyortoni:如果它總是一串字符串,那麼使用泛型方法的目的是什麼? – recursive

回答

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

在其他的答案說,可枚舉已經在System.Linq的命名空間存在,所以靜態類被命名爲不同的位置。

那麼你只要確保你的調用代碼有using這個類的命名空間,然後只用

string s = myArray.LastNotEmpty(); 

s如果沒有發生將等於空。

上述調用方法可以由LastNotEmpty的任何一個實現使用,因爲GenericType arugments可以由編譯器計算出來。不需要

這條線之下的更新來回答他們只是作爲替代解決方案的一個更通用的方法

更新的問題 - 只是爲了取悅遞歸誰想要一個完全通用的解決方案。該任擇議定書已經表示,集合將永遠是字符串,但是...

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是因爲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) 
           ); 
    } 
} 
+0

爲什麼降低標記 –

+0

因爲有一個可以做到這一點的開箱即用方法。 – Rawling

+0

@Rawling - 是的,因爲這真的回答了OP的問題。 –

3

假設你有一個IEnumerable<string>,你可以叫

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

here

+0

當然有趣的問題是如果最後一個元素爲null。 OP沒有真正說明如何處理null! –

+0

我完全錯過了「我認爲空值爲空」,是不是? – Rawling

相關問題