Самый быстрый способ получить подмножество массива элементов в строку? - PullRequest
0 голосов
/ 30 мая 2019

Мой метод получает массив позиций, которые используются для объединения некоторых элементов в другом массиве. В настоящее время я перебираю позиции и добавляю их к StringBuilder, но есть ли более быстрый способ? Есть ли в C # какой-либо метод, который использует собственный код (похожий на Java System.arraycopy), чтобы сделать гораздо более быстрый "цикл"?

Основная идея:

int[] positions = new int[] { 2, 5, 7 };
string[] values = new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight" };

StringBuilder concat = new StringBuilder();

for ( int i = 0; i < positions.length; i++ )
{
    concat.Append(values[positions[i]]);
    concat.Append(",");
}

Есть ли что-нибудь быстрее?

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

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

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

concat += $"{values[positions[i]]},"

Стоит упомянуть одну вещь, хотя, возможно, вы приняли это во внимание, позиция 0 вернет значение «три», запоминаемое в массивах c #, начиная с 0

РЕДАКТИРОВАТЬ: Исходя из того, что пользователь Стив указал, я сделал небольшую попытку и ошибку, и я нашел, что самый быстрый способ сделать это так

        string concat3 = "";
        for (int i = 0; i < positions.Length; i++)
        {
            concat3 += values[positions[i]] + ", ";
        }
        Console.WriteLine(stop.ElapsedTicks);

но мы говорим о 5 тиках (примерно по 20 попыток с каждой) разницы между 3 из них, так что я бы даже не считал это снижением производительности

0 голосов
/ 30 мая 2019

Попробуйте:

int[] positions = new int[] { 2, 5, 7 };
string[] values = new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight" };

var res = string.Join(",", positions.Select(f => values[f]));

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