Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换列表的最快方法<;int>;列出<;国际?>;_C#_Performance_Linq - Fatal编程技术网

C# 转换列表的最快方法<;int>;列出<;国际?>;

C# 转换列表的最快方法<;int>;列出<;国际?>;,c#,performance,linq,C#,Performance,Linq,获取原语列表并将其转换为可为空的原语列表的最快方法是什么?例如:List到List 简单的解决方案是创建一个新列表并使用foreach循环添加每个项目,这需要花费太多的时间。没有比创建一个新列表更快的方法了: var newList = list.Select( i => (int?)i ).ToList(); 但是,使用LINQ比使用裸循环慢 最快的方法是使用预先分配容量的列表: List<int?> newList = new List<int?>(list.

获取原语列表并将其转换为可为空的原语列表的最快方法是什么?例如:
List
List


简单的解决方案是创建一个新列表并使用
foreach
循环添加每个项目,这需要花费太多的时间。

没有比创建一个新列表更快的方法了:

var newList = list.Select( i => (int?)i ).ToList();
但是,使用LINQ比使用裸循环慢

最快的方法是使用预先分配容量的
列表

List<int?> newList = new List<int?>(list.Count); // Allocate enough memory for all items
foreach (var i in list)
    newList.Add(i);
List newList=新列表(List.Count);//为所有项目分配足够的内存
foreach(列表中的变量i)
新列表。添加(i);

如果您正在查找列表项的就地类型更改,则不可能进行更改。

您可以坚持使用
Cast
LINQ操作符,而不是
Select

List<int> first = new List<int>() {1, 2, 3};
List<int?> second = first.Cast<int?>().ToList();
List first=newlist(){1,2,3};
List second=first.Cast().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 ) );
List List=Enumerable.Range(0,10000).ToList();
Stopwatch sw=Stopwatch.StartNew();
对于(int i=0;i<100000;i++){
List newList=新列表();
foreach(列表中的整数)
添加((int?)整数);
}
sw.Stop();
TimeSpan TimeSpan=已用软件;
WriteLine(String.Format(“Foreach:{0:00}:{1:00}:{2:00}”)、timespan.Minutes、timespan.Seconds、timespan.millizes/10);
sw.Restart();
对于(int i=0;i<100000;i++){
List newList=List.Select(x=>(int?)x.ToList();
}
sw.Stop();
timespan=经过的时间间隔;
WriteLine(String.Format(“LINQ Select:{0:00}:{1:00}:{2:00}”)、timespan.Minutes、timespan.Seconds、timespan.millizes/10);
sw.Restart();
对于(int i=0;i<100000;i++){
List newList=List.Cast().ToList();
}
sw.Stop();
timespan=经过的时间间隔;
WriteLine(String.Format(“LINQ Cast:{0:00}:{1:00}:{2:00}”),timespan.Minutes,timespan.Seconds,timespan.millizes/10);
结果:


正如我们所期望的,最好的方法是第一个解决方案(
foreach
),这意味着循环遍历元素,强制转换并将它们添加到一个新列表中。

这不是一个新问题,但我目前使用此代码;我分享它,希望它能帮助其他人解决同样的问题: 具有预分配+Linq的列表:

var branchIds=新列表(branchs.Count);
AddRange(branchs.Select(int.Parse).Select(brId=>(int?)brId));

你对时间过长的定义是什么?唯一的方法是循环(使用
foreach
LINQ
)不聪明,但你不能稍微重构你的代码,这样你就不必转换了吗?可能是重复的,不使用LINQ会更快。@JeffMercado,事实上,我同意:-)我没有衡量性能差异,但我想这是微不足道的。@Fuex有趣。我的测试还表明,一个裸循环比LINQ(1000000)项快30%-40%。你真的怎么知道迭代项的性能会优于像
Cast
method?!:)这样的东西呢我打赌你以前没量过@我测量的Armanebrahinpur您是否在没有foreach的情况下使用了一个简单的“for(I=0;ISelect慢?你能证明这一点吗?在同一个问题上看到另一个答案吗?你没有显示什么是
分支
,但因为你正在用
int.Parse
转换它,它必须是某个
字符串
集合,而问题是如何从
列表
创建
列表
var branchIds = new List<int?>(branches.Count);
branchIds.AddRange(branches.Select(int.Parse).Select(brId => (int?)brId));