2011-10-19 44 views
3

我有可能包含這樣過濾逗號分隔的字符串在C#

"Apple ,Banana, , , , Mango ,Strawberry , " 

值的動態字符串值我想過濾此字符串等

"Apple,Banana,Mango,Strawberry". 

我試圖用下面的代碼它的工作原理。

有沒有更好的方法在C#(。NET 2.0)中實現相同?

/// <summary> 
/// Convert "Comma Separated String" to "Comma Separated String" 
/// </summary> 
/// <param name="strWithComma">String having values separated by comma</param> 
/// <returns>String separated with comma</returns> 
private String CommaSeparatedString(String strWithComma) 
{ 
    String rtn = String.Empty; 

    List<String> newList= new List<string>(); 

    if (String.IsNullOrEmpty(strWithComma)) 
    { 
     return rtn; 
    } 

    String[] strArray = strWithComma.Split(",".ToCharArray()); 


    if (strArray == null || strArray.Length == 0) 
    { 
     return rtn; 
    } 

    String tmpStr = String.Empty; 
    String separator=String.Empty; 
    foreach (String s in strArray) 
    { 
     if (!String.IsNullOrEmpty(s)) 
     { 
      tmpStr =s.Replace(Environment.NewLine, String.Empty); 
      tmpStr = tmpStr.Trim(); 
      if (!String.IsNullOrEmpty(tmpStr)) 
      { 
       newList.Add(tmpStr); 
      } 
     } 
    } 

    if (newList != null && newList.Count > 0) 
    { 

     rtn = String.Join(",", newList.ToArray()); 
    } 
    return rtn; 

} 
+1

對於codereview.stackexchange.com。 –

+0

你可以在逗號之間有多個單詞嗎? –

+0

@Rune,如果逗號中有多個單詞,我想保留它,因爲它正在考慮單詞之間的單個空格。雖然我沒有在我的帖子中提到這一點。非常感謝你的澄清。 – Hoque

回答

6

我相信下面的應該做任何.NET版本的伎倆:

string[] TrimAll(string[] input) 
{ 
    var result = new List<string>(); 
    foreach(var s in input) 
     result.Add(s.Trim()); 
    } 
    return result.ToArray(); 
} 

var delimiters = new [] { ",", "\t", Environment.NewLine }; 
string result = string.Join(",", TrimAll(input.Split(delimiters, StringSplitOptions.RemoveEmptyEntries))); 

編輯:更新以處理空格,製表符和換行符。

+0

似乎漂亮的代碼,我必須嘗試。 – Hoque

+0

不幸的是'StringSplitOptions.RemoveEmptyEntries'不會刪除只包含空格的條目。 – Konamiman

+0

如何處理空白區域和換行符?謝謝。 – Hoque

2
var result = Regex.Replace(strWithComma, ",+", ",").TimEnd(','); 
result = Regex.Replace(result, "\s+", string.Empty); 
0

警告這種方法只適用於C#3.0或更高版本。對不起球員didnt閱讀問題不夠好

這會工作,但它可以做到像要容易得多:

string input = "apple,banana,, \n,test\n, ,juice"; 

var parts = from part in input.Split(',') 
      let trimmedPart = part.Replace("\n", "") 
      where !string.IsNullOrWhiteSpace(trimmedPart) 
      select trimmedPart; 

string result = string.Join(",", parts); 
7

你也可以使用正則表達式:

string str = @"Apple ,,Banana, , , , Mango ,Strawberry , "; 
string result = Regex.Replace(str, @"(\s*,\s*)+", ",").TrimEnd(','); 
+4

對於工作解決方案+1,即使對於「多個單詞」和NewLine方案 –

2

假設你的項目不包含空格:

private String CommaSeparatedString(String strWithComma) 
{ 
    string[] tokens = strWithComma 
     .Replace(" ", "") 
     .Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries); 
    return string.Join(",", tokens); 
} 

現在我不知道如果C#2.0中接受new char[] {','}語法。如果沒有,您可以在其他地方定義數組(例如,作爲類私有成員)。

+0

數組語法從1.0開始有效,因此這不會成爲問題。 're code will not work with multiple words between commas –

2
Regex regex = new Regex(@"\w(?:(?!,|).)*"); 
      var items = regex.Matches("Apple ,Banana, , , , Mango ,Strawberry , ").Cast<Match>().Select(m => m.Value); 

.NET 2.0版本

List<string> newList = new List<string>(); 

      Regex regex = new Regex(@"\w(?:(?!,|).)*"); 
      string str = "Apple ,Banana, , , , Mango ,Strawberry , "; 
      MatchCollection matches = regex.Matches(str); 
      foreach (Match match in matches) 
      { 
       newList.Add(match.Value); 
      } 
+0

This works ...當然,你會把strWithComma作爲regex.Matches()中的第一個參數,而不是我爲例子所做的文字字符串... – Matt

+0

Just編輯嘗試以上版本 – Matt

+0

是否包含刪除「新換行」? – Hoque

2

這裏是一個班輪:

var outputString = string.Join(",", inputString.Replace(" ", string.Empty).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); 
+0

當單詞之間存在合理的空格時,將不會工作,如果您使用「」和「,」分隔單詞之間不允許有空格,則會更乾淨和更快 –

+0

在我的代碼中,我還檢查了新換行。此代碼是否會處理新的換行符? – Hoque

+0

@Rune FS,那麼它會比原來的帖子更復雜。考慮一下這個字符串:''蘋果,香蕉,菠蘿橙,芒果,草莓,''。注意',菠蘿橙,'和空間是如何模糊放置。 @霍克,你可以請在必要時更新你的問題嗎? –

1

由於沒有正則表達式,沒有裂痕和連接,修剪等,O(n)的時間。 StringBuilder是一個很好的類來處理字符串。

編輯 如果字符串不以字母結尾,它將添加一個逗號。所以額外的TrimEnd( '')添加

string strWithComma = ",Apple ,Banana, , , , Mango ,Strawberry , \n John,"; 
var sb = new StringBuilder(); 
var addComma = false; 
foreach (var c in strWithComma) 
{   
    if (Char.IsLetter(c)) // you might want to allow the dash also: example Anne-Marie 
    { 
    addComma = true; 
    sb.Append(c);   
    } 
    else 
    {   
    if (addComma) 
    { 
     addComma = false; 
     sb.Append(','); 
    } 
    } 
} 
string rtn = sb.ToString().TrimEnd(','); 
+0

似乎很有趣。應該試一試。 – Hoque

+0

請參閱編輯 –

+1

Upvote from myself。 – Hoque