2010-05-29 3 views
1

Правильно ли это метод для изменения строки? Я планирую использовать его для изменения строки, например: Продукты » X1 » X3-X3 « X1 « Продукты Я хочу, чтобы это была глобальная функция, которую можно использовать в другом месте.Лучший способ изменить строку в C#

public static string ReverseString(string input, string separator, string outSeparator) 
{ 
    string result = String.Empty; 
    string[] temp = Regex.Split(input, separator, RegexOptions.IgnoreCase); 
    Array.Reverse(temp); 
    for (int i = 0; i < temp.Length; i++) 
    { 
     result += temp[i] + " " + outSeparator + " "; 
    } 
    return result; 
} 
+0

вы хотите просто изменить строку или отменить его с мо различая некоторые символы типа '' '->' ''? –

+0

Я вызываю эту функцию следующим образом: ReverseString («test» test2 »,« »», «« ») заменяет разделитель на outSeparator. Я хотел, чтобы это было гибким, поэтому я использую два параметра. :) –

+1

Выглядит хорошо для меня. Вместо того, чтобы перебирать строковый массив (temp), почему бы не вызвать temp.Join ("" + outSeperator + "") –

ответ

7

Как насчет:

String.Join(" « ", "Products » X1 » X3".Split(new[]{" » "}, 
    StringSplitOptions.None).Reverse().ToArray()); 

EDIT: Обновленная версия версия будет работать, если компоненты содержат пробелы (например, «Foo продукты» X1 »X3")

+0

Ничего себе, очень короткая и одиночная строка, вроде бы ... Но у меня ошибка: «Нет перегрузки для метода« Реверс », принимает 0 аргументов " –

+2

@ Хасан, вам нужно добавить' using System.Linq; ', чтобы получить [' Enumerable.Reverse'] (http://msdn.microsoft.com/en-us/library/bb358497.aspx). –

1

Вы должны использовать StringBuilder, а не агрегации только строки, особенно если это будет использоваться много.

Вы также можете использовать String.Join(), чтобы связать массив строк с разделителями.

+0

http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html – Rubys

2

Да, похоже, все в порядке.

О StringBuilder:
Нет необходимости использовать StringBuilder, если нет обычно более 4-5 элементов после раскола. Если есть обычно меньше, чем тогда, то агрегация в порядке.

+0

Зависит от того, сколько раз эта функция вызывается ... Если он вычислен в цикле, тогда может быть гораздо больше. – cjk

0

я использовал следующее:

/// <summary> 
    /// From BReusable 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="items"></param> 
    /// <param name="toStringFunc"></param> 
    /// <param name="seperator"></param> 
    /// <returns></returns> 
    public static string ToJoinedString<T>(this IList<T> items, Func<int, T, string> toStringFunc, string seperator) 
    { 

     var sb = new StringBuilder(); 

     for (int i = 0; i < items.Count(); i++) 
     { 
      sb.Append((i != 0 ? seperator : String.Empty) + toStringFunc(i,items[i])); 

     } 
     return sb.ToString(); 
    } 

    public static string ToStringFromCharArray(this IEnumerable<char> items) 
    { 
     return items.ToJoinedString(x => x.ToString(), string.Empty); 
    } 

с stringValue.Reverse().ToStringFromCharArray();

Смежные вопросы