什么是将原始列表转换为可空原始列表的最快方法?例如:
简单的解决方案是创建一个新列表,并使用
List<int>
转换为 List<int?>
。简单的解决方案是创建一个新列表,并使用
foreach
循环添加每个项目,但这需要太多时间。List<int>
转换为 List<int?>
。foreach
循环添加每个项目,但这需要太多时间。没有比创建一个新列表更快的方法:
var newList = list.Select( i => (int?)i ).ToList();
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
方法这样的东西表现更好吗?! :)) 我敢打赌你以前没有测量过! - Arman Ebrahimpour你可以使用 Cast
LINQ 操作符而不是 Select
:
List<int> first = new List<int>() {1, 2, 3};
List<int?> second = first.Cast<int?>().ToList();
Select
更慢 - Avestura如果你想知道更快的解决方案,你应该通过使用三种不同的方法进行一些基准测试:基准测试。
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
),这意味着循环遍历元素,进行转换并将其添加到新列表中。
这不是一个新问题,但我目前正在使用这段代码;我分享它的目的是希望它能帮助其他有同样问题的人: 预分配列表 + Linq:
var branchIds = new List<int?>(branches.Count);
branchIds.AddRange(branches.Select(int.Parse).Select(brId => (int?)brId));
branches
是什么,但由于你正在使用int.Parse
进行转换,它必须是一些string
集合,而问题是如何从List<int>
创建一个List<int?>
。 - Lance U. Matthews
foreach
或LINQ
)。 - psubsee2003