Фильтрация строки через запятую в C # - PullRequest
3 голосов
/ 19 октября 2011

У меня есть динамическое строковое значение, которое может содержать такие значения, как

"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;

}

Ответы [ 8 ]

7 голосов
/ 19 октября 2011

Вы также можете использовать Regex:

string str = @"Apple   ,,Banana, , , ,  Mango  ,Strawberry  , ";
string result = Regex.Replace(str, @"(\s*,\s*)+", ",").TrimEnd(',');
6 голосов
/ 19 октября 2011

Я полагаю, что в любой версии .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 ) ) );

Редактировать: обновлено для работы с пробелами, символами табуляции и новой строки.

2 голосов
/ 19 октября 2011

Вот одна строка:

var outputString = string.Join(",", inputString.Replace(" ", string.Empty).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
2 голосов
/ 19 октября 2011
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);
            }
2 голосов
/ 19 октября 2011

Предполагая, что ваши элементы не содержат пробелов:

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

Теперь я не уверен, что C # 2.0 принимает синтаксис new char[] {','}.Если нет, вы можете определить массив где-нибудь еще (например, как закрытый член класса).

2 голосов
/ 19 октября 2011
var result = Regex.Replace(strWithComma, ",+", ",").TimEnd(',');
result = Regex.Replace(result, "\s+", string.Empty);
1 голос
/ 19 октября 2011

Без регулярных выражений, без разбиений и объединений, обрезок и т. Д., Время O (n).StringBuilder - очень хороший класс для работы со строками.

EDIT Если строка не заканчивается буквой, она добавляет запятую.Поэтому добавляется дополнительный 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 голосов
/ 19 октября 2011

Предупреждение этот метод будет применяться только для C # 3.0 или выше. Извините, ребята, не прочитали вопрос достаточно хорошо

Это будет работать, но это можно сделать намного проще, например:

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