Самый быстрый способ преобразования List <int> в список <int?> - программирование
Подтвердить что ты не робот

Самый быстрый способ преобразования List <int> в список <int?>

Каков самый быстрый способ взять список примитивов и преобразовать его в нулевой список примитивов например: List<int> до List<int?> в С#

простое решение, создание нового списка и добавление каждого элемента в цикл foreach занимает слишком много времени.

Спасибо

4b9b3361

Ответ 1

Нет способа быстрее создать новый список:

var newList = list.Select( i => (int?)i ).ToList();

Однако использование LINQ медленнее, если использовать замкнутый контур.

Самый быстрый способ - использовать List<int?> с заранее установленной емкостью:

List<int?> newList = new List<int?>(list.Count); // Allocate enough memory for all items
foreach (var i in list)
    newList.Add(i);

Если вы ищете замену предметов на месте, это невозможно.

Ответ 2

Вместо Select вы можете придерживаться оператора Cast LINQ:

List<int> first = new List<int>() {1, 2, 3};
List<int?> second = first.Cast<int?>().ToList();

Ответ 3

Если вы хотите узнать, какое более быстрое решение, вы должны сделать немного benchmark, используя три разных способа:

List<int> list = Enumerable.Range( 0, 10000 ).ToList( );
Stopwatch sw = Stopwatch.StartNew( );

for ( int i = 0; i < 100000; i++ ) {
   List<int?> newList = new List<int?>( );
   foreach( int integer in list )
      newList.Add( ( int? ) integer );
}

sw.Stop( );
TimeSpan timespan = sw.Elapsed;
Console.WriteLine( String.Format( "Foreach: {0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10 ) );
sw.Restart( );

for ( int i = 0; i < 100000; i++ ){
   List<int?> newList = list.Select( x => ( int? ) x ).ToList( );
}

sw.Stop( );
timespan = sw.Elapsed;
Console.WriteLine( String.Format( "LINQ-Select: {0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10 ) );
sw.Restart( );

for ( int i = 0; i < 100000; i++ ){
   List<int?> newList = list.Cast<int?>( ).ToList( );
}

sw.Stop();
timespan = sw.Elapsed;
Console.WriteLine( String.Format( "LINQ-Cast: {0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10 ) );

Результаты:

Benchmark

Как и следовало ожидать, наилучшим способом является первое решение (foreach), которое означает цикл через элементы, добавление и добавление их в новый список.

Ответ 4

Это не новый вопрос, но я использую этот код в настоящее время; Я разделяю это с надеждой, что он может помочь другим с тем же вопросом: Список с предустановленным + Linq:

var branchIds = new List<int?>(branches.Count);
branchIds.AddRange(branches.Select(int.Parse).Select(brId => (int?)brId));