Как вы делите строку с двумя символами в C#? - PullRequest
0 голосов
/ 29 февраля 2020

Я знаю, как сделать разбиение строки, если есть буква, число, которое я хочу заменить.

Но как мне сделать подсчет string.Split() на 2 char без замены существующих букв, цифр и т. Д. c ...?

Пример:

string MAC = "00122345"

Я хочу, чтобы эта строка выводила: 00: 12: 23: 45

Ответы [ 6 ]

2 голосов
/ 29 февраля 2020

Вы можете создать метод расширения LINQ, чтобы получить IEnumerable<string> деталей:

public static class Extensions
{
    public static IEnumerable<string> SplitNthParts(this string source, int partSize)
    {
        if (string.IsNullOrEmpty(source))
        {
            throw new ArgumentException("String cannot be null or empty.", nameof(source));
        }

        if (partSize < 1)
        {
            throw new ArgumentException("Part size has to be greater than zero.", nameof(partSize));
        }

        return Enumerable
            .Range(0, (source.Length + partSize - 1) / partSize)
            .Select(pos => source
                .Substring(pos * partSize, 
                    Math.Min(partSize, source.Length - pos * partSize)));
    }
}

Использование:

var strings = new string[] { 
    "00122345", 
    "001223453" 
};

foreach (var str in strings)
{
    Console.WriteLine(string.Join(":", str.SplitNthParts(2)));
}
// 00:12:23:45
// 00:12:23:45:3

Объяснение:

  • Используйте Enumerable.Range, чтобы получить количество позиций для среза строки. В этом случае это length of the string + chunk size - 1, так как нам нужно получить достаточно большой диапазон, чтобы также соответствовать оставшимся размерам куска.
  • Enumerable.Select каждой позиции нарезки и получите startIndex, используя String.Substring, используя позицию, умноженную на 2, чтобы перемещаться вниз по строке каждые 2 символа. Вам нужно будет использовать Math.Min для вычисления наименьшего размера оставшегося размера, если в строке недостаточно символов для размещения другого фрагмента. Вы можете вычислить это как length of the string - current position * chunk size.
  • String.Join конечный результат с ":".

Вы также можете заменить запрос LINQ на yield здесь для увеличения производительности для больших строк, так как все подстроки не будут сохранены в памяти сразу:

for (var pos = 0; pos < source.Length; pos += partSize)
{
    yield return source.Substring(pos, Math.Min(partSize, source.Length - pos));
}
0 голосов
/ 29 февраля 2020

Вот вариант с одной (1) строкой, использующий LINQ Enumerable.Aggregate .

string result = MAC.Aggregate("", (acc, c) => acc.Length % 3 == 0 ? acc += c : acc += c + ":").TrimEnd(':');
0 голосов
/ 29 февраля 2020

Довольно быстрое решение, в 8-10 раз быстрее текущего принятого ответа (решение регулярных выражений) и в 3-4 раза быстрее, чем решение LINQ

public static string Format(this string s, string separator, int length)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.Length; i += length)
    {
        sb.Append(s.Substring(i, Math.Min(s.Length - i, length)));
        if (i < s.Length - length)
        {
            sb.Append(separator);
        }
    }

    return sb.ToString();
}

Использование:

string result = "12345678".Format(":", 2);
0 голосов
/ 29 февраля 2020

Легкое для понимания и простое решение.

Это простой быстрый измененный ответ, в котором вы можете легко изменить разбивку char.

  • Этот ответ также проверяет, является ли число even или odd, чтобы сделать подходящий string.Split().

вход: 00122345

выход: 00: 12: 23: 45


вход: 0012234

выход: 00: 12: 23: 4



//The List that keeps the pairs
List<string> MACList = new List<string>();

//Split the even number into pairs
for (int i = 1; i <= MAC.Length; i++)
{               
    if (i % 2 == 0)
    {
        MACList.Add(MAC.Substring(i - 2, 2));
    }
}

//Make the preferable output
string output = "";
for (int j = 0; j < MACList.Count; j++)
{
    output = output + MACList[j] + ":";
}

//Checks if the input string is even number or odd number
if (MAC.Length % 2 == 0)
{
    output = output.Trim(output.Last());
}
else
{
    output += MAC.Last();
}

//input : 00122345
//output : 00:12:23:45

//input : 0012234
//output : 00:12:23:4
0 голосов
/ 29 февраля 2020

Попробуйте так.

    string MAC = "00122345";
    MAC = System.Text.RegularExpressions.Regex.Replace(MAC,".{2}", "$0:");
    MAC = MAC.Substring(0,MAC.Length-1);
    Console.WriteLine(MAC);
0 голосов
/ 29 февраля 2020

Вы можете использовать что-то вроде этого:

string newStr= System.Text.RegularExpressions.Regex.Replace(MAC, ".{2}", "$0:");

Чтобы обрезать последнее двоеточие, вы можете использовать что-то вроде этого.

    newStr.TrimEnd(':');

Microsoft Document

...