簡體   English   中英

轉換列表的最快方法<int>列出<int?>

[英]Fastest way to convert List<int> to List<int?>

獲取原語列表並將其轉換為可為空的原語列表的最快方法是什么? 例如: List<int>List<int?>

創建一個新列表並使用foreach循環添加每個項目的簡單解決方案需要太多時間。

沒有比創建新列表更快的方法了:

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

如果您正在尋找列表項的就地類型更改,這是不可能的。

您可以使用Cast LINQ-operator 而不是Select

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

如果你想知道什么是更快的解決方案,你應該使用三種不同的方式做一些基准測試

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

結果:

基准

正如我們所期望的,最好的方法是第一個解決方案( foreach ),這意味着循環遍歷元素,將它們轉換並添加到新列表中。

這不是一個新問題,但我目前使用此代碼; 我分享它,希望它可以幫助其他人解決同樣的問題: List with pre-allocated + Linq

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM