string.insert несколько значений. Это возможно? - PullRequest
3 голосов
/ 28 февраля 2012

Я все еще учусь на C #, и есть одна вещь, на которую я не могу найти ответ.

Если у меня есть строка, которая выглядит как «abcdefg012345», и я хочу, чтобы она выглядела как «ab-cde-fg-012345»

я думал о чем-то вроде этого:

  string S1 = "abcdefg012345";
            string S2 = S1.Insert(2, "-");
            string S3 = S2.Insert(6, "-");
            string S4 = S3.Insert.....
                ...
                ..

Теперь я искал, можно ли как-нибудь перевести этот al в 1 строку, без необходимости создавать все эти строки.

Полагаю, это как-нибудь возможно?

Ответы [ 8 ]

7 голосов
/ 28 февраля 2012

Независимо от того, можете ли вы сделать это однострочным (можно), оно всегда будет вызывать создание нескольких строк из-за неизменности String в .NET

Если вы хотите сделать это несколько эффективно, без создания нескольких строк, вы можете использовать StringBuilder. Метод расширения также может быть полезен для упрощения использования.

public static class StringExtensions
{
    public static string MultiInsert(this string str, string insertChar, params int[] positions)
    {
        StringBuilder sb = new StringBuilder(str.Length + (positions.Length*insertChar.Length));
        var posLookup = new HashSet<int>(positions);
        for(int i=0;i<str.Length;i++)
        {
            sb.Append(str[i]);
            if(posLookup.Contains(i))
                sb.Append(insertChar);

        }
        return sb.ToString();

    }
}

Обратите внимание, что этот пример инициализирует StringBuilder до правильной длины вперед, поэтому избегая необходимости увеличивать StringBuilder.

Использование: "abcdefg012345".MultiInsert("-",2,5); // yields "abc-def-g012345"

Живой пример: http://rextester.com/EZPQ89741

4 голосов
/ 28 февраля 2012
string S1 = "abcdefg012345".Insert(2, "-").Insert(6, "-")..... ;
2 голосов
/ 28 февраля 2012

Если позиции для вставленных строк постоянны, вы можете использовать метод string.Format(). Например:

string strTarget = String.Format("abc{0}def{0}g012345","-");
1 голос
/ 28 февраля 2012
string s = "abcdefg012345";
foreach (var index in [2, 6, ...]
{
    s = s.Insert(index, "-");
}
0 голосов
/ 28 февраля 2012

Просто для завершения и чтобы показать использование менее известной функции Aggregate, вот еще одна строка:

string result = new[] { 2, 5, 8, 15 }.Aggregate("abcdefg012345", (s, i) => s.Insert(i, "-"));

result - это ab-cd-ef-g01234-5. Я бы не стал рекомендовать этот вариант. Слишком сложно понять с первого взгляда.

Редактировать: это решение, в любом случае, недопустимо, так как «-» будет вставляться в индекс уже измененной строки, а не в позиции по отношению к исходной строке. Но опять же, большинство ответов здесь страдают от той же проблемы.

0 голосов
/ 28 февраля 2012
        String s1 = "abcdefg012345";
        String seperator = "-";
        s1 = s1.Insert(2, seperator).Insert(6, seperator).Insert(9, seperator);

Цепочка их таким образом уменьшает вашу линию отсчета. Это работает, потому что метод Insert возвращает строковое значение s1 с предоставленными параметрами, затем вызывается функция Insert для этой возвращенной строки и т. Д.

Также стоит отметить, что String - это специальный неизменяемый класс, поэтому каждый раз, когда вы устанавливаете для него значение, он воссоздается. Также стоит отметить, что String - это специальный тип, который позволяет вам установить его на новый экземпляр с вызовом конструктора, первая строка выше будет скрыта, вызывая конструктор с текстом в речевых метках.

0 голосов
/ 28 февраля 2012

Мне нравится

    StringBuilder sb = new StringBuilder("abcdefg012345");
    sb.Insert(6, '-').Insert(2, '-').ToString();
0 голосов
/ 28 февраля 2012

В этом случае вы должны использовать StringBuilder, поскольку Strings objects равны immutable, и ваш код по существу создаст совершенно новую строку для каждой из этих операций. http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx

Дополнительная информация доступна здесь: http://www.dotnetperls.com/stringbuilder

Пример:

namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder("abcdefg012345");
            sb.Insert(2, '-');
            sb.Insert(6, '-');

            Console.WriteLine(sb);
            Console.Read();
        }
    }
}

Если вы действительно хотите, чтобы это было в одной строке, вы могли бы просто сделать что-то вроде этого:

StringBuilder sb = new StringBuilder("abcdefg012345").Insert(2, '-').Insert(6, '-');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...