C # Упрощение инициализации массива строк

#c# #arrays

#c# #массивы #linq

Вопрос:

C # Упрощение инициализации массива строк. Есть ли способ оптимизировать приведенный ниже код на C#

 string[] createdBy = new string[totalRowCount];
for (long i = 0; i < totalRowCount; i  )
{
    createdBy[i] = userName;
}
  

Также

 int?[] defaultInd = new int?[totalRowCount];
        for (long i = 0; i < totalRowCount; i  )
        {
            if (i == 0)
            {
                defaultInd[i] = 1;
            }
            else
            {
                defaultInd[i] = 0;
            }
        }
  

Комментарии:

1. Не пытаясь быть придурком, просто хочу предложить несколько альтернативных советов, поскольку приведенные ниже ответы дают вам то, что вы хотите. ИМХО, вы должны стремиться к удобочитаемости, а не к умному синтаксическому сахару. Я сомневаюсь, что использование сокращенных методов приведет к заметному увеличению производительности, и вы просто усложняете отладку, если что-то пойдет не так, поскольку я предполагаю, что вы не слишком хорошо знакомы с синтаксисом. Только мои два цента 😉

Ответ №1:

 string[] myIntArray = Enumerable.Repeat(userName, totalRowCount).ToArray();
  

Ответ №2:

Вы можете использовать Enumerable.Range для построения повторяющихся последовательностей:

 string[] createdBy = Enumerable.Range(0, totalRowCount)
    .Select(i => userName)
    .ToArray();
int?[] defaultInd = Enumerable.Range(0, totalRowCount)
    .Select(i => i==0 ? (int?)1 : 0)
    .ToArray();
  

Обратите внимание, что первое лямбда-выражение не использует значение index i , потому что все элементы имеют одинаковую строку.

Ответ №3:

Существует не так много способов упростить цикл for в обоих примерах, если вы не используете перечисление.Диапазон, как показано в других ответах. Однако во втором примере вы могли бы использовать тернарный оператор:

 defaultInd[i] = i == 0 ? 1 : 0;