- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近了解了 List 的 .ConvertAll 扩展。我今天在工作中的代码中使用了几次它,将我的大量对象列表转换为其他一些对象的列表。它似乎工作得很好。但是,我不确定与仅迭代列表和转换对象相比,这有多高效或多快。 .ConvertAll 是否使用任何特殊的东西来加速转换过程,或者它只是一种无需设置循环即可转换列表的快捷方式?
最佳答案
没有比直接访问源代码更好的查找方法了:)
http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#dbcc8a668882c0db
如您所见,并没有发生什么特别的魔法。它只是遍历列表并通过您指定的转换器函数创建一个新项目。
老实说,我并不知道这个方法。进行这种投影的更惯用的 .NET 方法是使用 Select
。 IEnumerable<T>
上的扩展方法像这样:source.Select(input => new Something(input.Name))
.这样做的好处有三:
ConvertAll
很可能是 C#3.0 之前时代的残余。无论如何,这都不是一个非常神秘的方法,而且 ConvertAll
是一个非常清晰的描述,但坚持其他人所知道的可能会更好,即 Select
.IEnumerable<T>
, 而 ConvertAll
仅适用于 List<T>
的实例.不管是数组、列表还是字典,Select
与他们所有人一起工作。Select
很懒惰。在您对其进行迭代之前,它不会执行任何操作。这意味着它返回一个 IEnumerable<TOutput>
然后您可以通过调用 ToList()
将其转换为列表或者如果您实际上并不需要列表。或者,如果您只想转换和检索一百万项列表中的前两项,您可以简单地执行 source.Select(input => new Something(input.Name)).Take(2)
。 .但如果您的问题纯粹是关于将整个列表转换为另一个列表的性能,那么 ConvertAll
可能会快一些,因为它不如 Select
通用其次是 ToList
(它知道列表有一个大小,并且可以通过索引从底层数组直接访问元素)。
关于C# List .ConvertAll 效率和开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23439049/
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 数组。 我收到“只有赋值调用、递增、递减、等待和新对象
我是一名优秀的程序员,十分优秀!