В C # есть удобный способ переключения двух разделов строки, разделенных запятой? - PullRequest
2 голосов
/ 16 сентября 2010

У меня есть несколько пар длин / длин в виде строки:

-94.5555,95.5555

Используемый мной API требует, чтобы они были переключены:

95.555, -94.555

Есть ли какой-нибудь хитрый, короткий способ сделать это?

Ответы [ 8 ]

13 голосов
/ 16 сентября 2010

Однострочник с Linq:

string.Join(",", original.Split(',').Reverse());

Или, более явно (может быть улучшение производительности):

string[] split = original.Split(',');
string reversed = split[1] + "," + split[0];
3 голосов
/ 16 сентября 2010
String reversedLatLong = String.Join(",", yourString.Split(',').Reverse());
3 голосов
/ 16 сентября 2010

Просто напишите метод, чтобы сделать это, например, используя string.IndexOf:

// Probably rename to reflect your specific usage
private static string SwitchSplitOnComma(string text)
{
    // Optional: validate that text is non-null
    int comma = text.IndexOf(',');
    // Optional: validate that there's a comma :)
    return text.Substring(comma + 1) + "," + text.Substring(0, comma);
}

Если вам не нужно это для различных целей, я бы оставил его в качестве специализированного метода в классе, который в этом нуждается.Рекламируйте его как «универсальный метод утилит» (возможно, параметризацию разделителя и т. Д.), Если вам понадобится та же функция в другом месте.

Хотя вы можете сделать это в одном выражении,Я думаю, что код, вероятно, будет намного легче понять, если вы поместите его в отдельный метод - в этот момент можно использовать несколько простых для понимания операторов вместо одного сложного и неэффективного:)

2 голосов
/ 16 сентября 2010

Основываясь на Джоне Ските, было бы полезно нечто более общее:

private static string Switch(this string text, char splitter)
{
    if(text != null && text.Length > 2) //Needs at least 3 letters for a valid switch
    {
        int position = text.IndexOf(splitter);
        if(position != -1) return text.Substring(position + 1) + splitter + text.Substring(0, position);
    }
    return text;
}

"99,-3432".Switch(',');
1 голос
/ 16 сентября 2010

Просто ради этого.Вот более быстрая версия, но вам, вероятно, она не понадобится:)

Для 1.000.000 итераций по сравнению с чистой версией Jon Skeets, измеренной в секундах на моей машине:

00:00: 00.2145657 подстрока

00: 00: 00.0781270 небезопасно

private unsafe static string SwitchSplitOnComma2(string text)
{
    int comma = text.IndexOf(',');
    string newString = string.Copy(text);
    fixed (char* src = text)
    {
        fixed (char* dst = newString)
        {
            int destCtr = 0;
            for (int i = comma + 1; i < text.Length; i++)
            {
                dst[destCtr++] = src[i];
            }
            dst[destCtr++] = ',';
            for (int i = 0; i < comma; i++)
            {
                dst[destCtr++] = src[i];
            }
        }
    }
    return newString;
}
1 голос
/ 16 сентября 2010
string myStr = "-94.5555,95.5555";
string[] components = myStr.Split(",")
components.Reverse();
string flippedStr = string.Join(",", components);
0 голосов
/ 16 сентября 2010

Как насчет этого?

string oldString = "-94.5555,95.5555";
string newString = oldString .Substring(oldString .IndexOf(",") + 1) + "," + oldString .Substring(0, oldString .IndexOf(","));
0 голосов
/ 16 сентября 2010

Наиболее эффективным будет изменение / расширение API, так как он все равно анализирует строку. Вероятно, не вариант, но я выкидываю это там ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...