- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑到您必须转换 mylist
类型 List<T>
至 List<Base>
其中 T
是 Base
的子类
这些解决方案是否相同?哪个性能更好,为什么?我应该什么时候更喜欢使用第一个或第二个?
return mylist.Cast<Base>().ToList();
return mylist.ConvertAll(x => (Base)x);
也许第二种解决方案会更好,因为 mylist 是直接转换的。
在第一个解决方案中,列表被转换为 IEnumerable,然后是列表,但我不确定。
最佳答案
TL;DR:ConvertAll
进行了 1 次内存分配,但在大多数情况下 .Cast.ToList
分配了不止一次。
大多数 LINQ 扩展(如 .Cast<T>()
)导致无法转换为 IEnumerable<T>
(无法获得结果的 ICollection<T>
)的延迟执行 .Count
。
当结果可以转换为 ICollection<T>
时, .ToList
和 .ToArray
可以只进行一次内存分配来复制元素,但如果不能:
更新
令人惊讶的是,差异似乎并没有我预期的那么显着:
method elapsed ratio count
Cast.ToList 00:00:14.4487329 1.3719890831991 123456789
ConvertAll 00:00:10.5312302 0.728868773261865
Cast.ToList 00:00:01.4959734 1.50233158227713 12345678
ConvertAll 00:00:00.9957678 0.665632016125407
Cast.ToList 00:00:00.1252968 2.45948743599897 1234567
ConvertAll 00:00:00.0509442 0.40658878161491
Cast.ToList 00:00:00.0082611 3.99145006839945 123456
ConvertAll 00:00:00.0020697 0.250535515380002
Cast.ToList 00:00:00.0008097 0.620558719826417 12345
ConvertAll 00:00:00.0013049 1.61145104895105
Cast.ToList 00:00:00.0001812 0.193207547169811 1234
ConvertAll 00:00:00.0009378 5.17578125
Cast.ToList 00:00:00.0001433 0.149501661129568 123
ConvertAll 00:00:00.0009587 6.68888888888889
所以,赛马!
int c = 123; var L = Enumerable.Range(0, c).ToList();
GC.Collect(); var sw1 = Stopwatch.StartNew(); L.Cast<object>().ToList(); sw1.Stop();
GC.Collect(); var sw2 = Stopwatch.StartNew(); L.ConvertAll(i => (object)i); sw2.Stop();
MessageBox.Show($"Cast.ToList\t{sw1.Elapsed}\t{(double)sw1.ElapsedTicks / sw2.ElapsedTicks}\n" +
$"ConvertAll \t{sw2.Elapsed}\t{(double)sw2.ElapsedTicks / sw1.ElapsedTicks}");
关于c# - linq .Cast<> 或在 ConvertAll 内转换列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427912/
ConverAll 的正确用法是什么?它会将一种类型转换为另一种类型吗? 喜欢 List intList = new List(); intList.Add(10); intList.Add(20);
我必须从数据表中获取两个字段。然后我应该检查一个。“listIDStr”保留非唯一的用户 ID 列表。所以我必须使用“更新行时作为主键的 ID”。 List listIDStr = new List(
我想像这样使用 ConvertAll: var sou = new[,] { { true, false, false }, { true, true, true } }; var tar = A
如果 ConvertAll 在一个元素上抛出异常,我可以跳过这个元素并继续下一个元素吗? 最佳答案 没有。异常需要在某处处理。如果您希望转换器中发生异常(这对应用程序来说是可以的),您必须在转换器中有
我正在尝试为 ConvertAll 方法(至少是一个具有相同签名的方法)的 List 类编写一个扩展方法,我有这个 public static class ListExtensionsClass
考虑一个输入列表 X,它由类型为 Tx 的对象组成,您需要为此运行几个函数之一,y_a = A(x)、y_b = B(x) 等...(所有这些Ty 的输出对象)生成输出列表 Y。最后,转换函数的选择是
我有以下代码 people = positions.ConvertAll(r=> r.Person).ToList(); 但在某些情况下“Person”将为空,在这些情况下我根本不
我最近了解了 List 的 .ConvertAll 扩展。我今天在工作中的代码中使用了几次它,将我的大量对象列表转换为其他一些对象的列表。它似乎工作得很好。但是,我不确定与仅迭代列表和转换对象相比,这
我似乎不知道正确的 bash 语法;尽管如此,我还是尝试创建一个工具来更改工作目录中 ffmpeg 接受的文件类型的所有文件的尺寸,并将其转换为另一个 ffmpeg 接受的文件类型。在这种情况下,此工
我想将具有相同索引的两个列表转换为一个列表。鉴于此: List ListA = new List { 1, 2, 3, 4, 5 }; List ListB = new List { "A
有没有人有扩展方法来快速转换 LinkedList 中的类型使用 Converter ? 我有点惊讶,ConvertAll(delegate) 在哪里? ? 最佳答案 Linq 扩展方法中的 Conv
考虑到您必须转换 mylist类型 List至 List其中 T是 Base 的子类 这些解决方案是否相同?哪个性能更好,为什么?我应该什么时候更喜欢使用第一个或第二个? return mylist.
首先我有这种线 List ratingComparisonIds = ratingComparison.ConvertAll(o => Guid.Parse(o)); 然后 ReSharper 提示我
我想为 ConvertAll 编写我的扩展方法List 中的方法.我在下面这样写。 public static List MyConvertAll(this List list, Converter
我的问题比较笼统,因此,我不会提供任何代码(除非有人要我添加它,但我认为我的问题已经足够清楚了)。我一直在看两篇关于 Array.ConvertAll 方法的文章,但我自己找不到直接使用它的方法。我读
'ConvertAll' 没有为 IList 实现,对吗?有什么解决方法吗? 谢谢。 最佳答案 IList没有定义名为 ConvertAll() 的方法.你可以在这里看到定义:http://msdn.
假设我有一个列表: $DeletedUsers = New-Object System.Collections.Generic.List[System.object] 所以我可以轻松地从集合中添加和删
我对 IEumerable 接口(interface)上的扩展方法有一个有趣的需求 - 与 List.ConvertAll 相同。这在 here 之前已经介绍过了我找到了一个解决方案 here .我不
我有一个 Car 对象数组 我想将它们转换为 Vehicle 对象列表 我觉得这行得通 Vehicle[] vehicles = cars.ConvertAll(car=> ConvertToVehi
我是 C# 的新手,作为练习,我尝试将 Y 和 N 的控制台输入转换为 true 和 false (Y=true N=false) 的 bool 数组。 我收到“只有赋值调用、递增、递减、等待和新对象
我是一名优秀的程序员,十分优秀!