web-dev-qa-db-ja.com

List <int>をList <int?>に変換する最速の方法

プリミティブのリストを取得し、それをnull許容のプリミティブのリストに変換する最速の方法は何ですか?例:List<int>からList<int?> in c#

新しいリストを作成し、foreachループですべてのアイテムを追加するという簡単な解決策は時間がかかりすぎます。

22
user1039544

新しいリストを作成するよりも速い方法はありません。

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);

リストアイテムのインプレース型キャストを探している場合、それは不可能です。

46

Selectの代わりに、CastLINQ演算子を使用できます。

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

より高速なソリューションを知りたい場合は、次の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)です。これは、要素をループし、キャストして新しいリストに追加することを意味します。

8
Omar

これは新しい質問ではありませんが、現在このコードを使用しています。私はそれが同じ質問で他の人を助けることができることを願ってそれを共有します:事前に割り当てられた+ Linqのリスト

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