2012-04-25 43 views
0

我知道我可以通過一個擴展名來做到這一點(我通過StringBuilder這樣做),但我經常需要它,我覺得應該有更好的方法。假設我將名字和姓氏結合起來,其中任何一個都可能缺失(空或空,不關心),如果兩者都存在,我只需要一個空格。所以在C#中是否有一個優雅的/內置的方法來添加一個字符串連接器IFF兩個字符串的長度> 0?

return firstName + (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName) ? " " : string.Empty) + lastName; 

給我Joe Smith但從來沒有Joe[trailingspace][leadingspace]Smith

顯然這是一個愚蠢的例子,但我在真實世界中不斷地做這個。任何更好的想法?

編輯:不建議String.Join。它不起作用。 (當然,除非你使用LINQ結合起來,如下面花錢做。)

+3

'string.Concat(第一,空間,最後).Trim()' – 2012-04-25 00:56:19

+0

@AnthonyPegram是的,這確實太,但我發現順序和加減邏輯有點不直觀。 – downwitch 2012-04-25 00:58:29

+0

@AnonyPegram別的東西在困擾着我,但它花了一個真實的世界時刻才能看到它......只有當連接器是空間時纔有效。 – downwitch 2012-04-25 03:06:37

回答

1

從這個博客String.Join method?,你可以創建一個發生在一個陣列擴展方法和分離器?:

string[] input = {"Joe", null, "Smith"}; 
return input.Aggregate((x,y)=>String.IsNullOrEmpty(y)?x :String.Concat(x, " ", y)); 
+0

是的,雖然如上所述,我可以使用擴展名,但我正在尋找一些簡單的東西 – downwitch 2012-04-25 01:05:14

+0

擴展確實使事情變得簡單。如果你適當地命名它,那麼開發者不會花太長時間閱讀,因爲他們只需要頂級方法。 – 2012-04-25 01:23:27

+0

我對擴展沒有任何反應(並且已經提到過使用一個擴展),但它並不是這裏的重點。 – downwitch 2012-04-25 02:15:30

3

我會去喜歡的東西:

public static string JoinNonEmpty(string separator, params string[] values) 
{ 
    return 
     string.Join(separator, values.Where(v => !string.IsNullOrEmpty(v))); 

} 
+0

。快五倍! (恕我直言違反了這個問題的「優雅」原則,但會投票給你至少解決string.join瑕疵。) – downwitch 2012-04-25 01:00:34

+2

Linq是優雅。 – spender 2012-04-25 01:01:37

+0

通常我100%同意你的看法。這裏感覺就像是矯枉過正,更重要的是,我認爲所陳述的目的不同於將數組顯示爲字符串,即使這實際上就是我正在做的。當你想將s1和s2與s2和s3分開時會發生什麼? – downwitch 2012-04-25 01:03:47

0

我個人使用的String.format():

var myName = string.Format("{0}{1}{2}" 
          , firstName 
          , !string.IsNullEmptyOrwhitespace(firstName) && !string.IsNullEmptyOrWhitespace(lastName) ? " " : string.empty 
          , lastName 
          ); 

這不是依賴於LINQ或擴展方法的巧妙代碼,它是一種標準,基本和直接的方法 - 重要的是,您可以立即看到發生了什麼以及結果應該如何。如果您正在尋找在許多不同的地方進行相同的操作,使用擴展方法變得更相關。

或者,您的數據對象可以封裝這個邏輯:

public class MyData 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string FullName 
    { 
     get { /*insert the string.Format() illustrated above */ } 
    } 
} 
+0

我認爲比我的產品更具可讀性,但仍然需要開發人員花太長時間閱讀我的想法。 (對不起,我知道我很挑剔。)第二種方法與擴展沒有區別。 – downwitch 2012-04-25 01:06:03

相關問題