C# C中Select和ConvertAll的区别#
我有一些清单:C# C中Select和ConvertAll的区别#,c#,.net,list,C#,.net,List,我有一些清单: List<int> list = new List<int> { 1, 2, 3, 4, 5 }; List List=新列表{1,2,3,4,5}; 我想对列表中的元素应用一些转换。我可以通过两种方式做到这一点: List<int> list1 = list.Select(x => 2 * x).ToList(); List<int> list2 = list.ConvertAll(x => 2 * x).ToLi
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
List List=新列表{1,2,3,4,5};
我想对列表中的元素应用一些转换。我可以通过两种方式做到这一点:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
list1=List.Select(x=>2*x.ToList();
List list2=List.ConvertAll(x=>2*x.ToList();
这两种方法的区别是什么?
ConvertAll
不是一个扩展,而是list类中的一个方法。您不必对结果调用ToList
,因为它已经是一个列表:
List<int> list2 = list.ConvertAll(x => 2 * x);
list2=List.ConvertAll(x=>2*x);
因此,区别在于ConvertAll
方法只能用于列表,并且它返回一个列表。Select
方法可用于实现IEnumerable
接口的任何集合,并返回一个IEnumerable
此外,他们的处理方式也不同,因此他们在不同的情况下有自己的优势。
ConvertAll
方法在列表中运行并一次性创建一个新列表,而Select
方法使用延迟执行,仅在需要时处理项目。如果不需要所有项目,则Select
方法更有效。另一方面,一旦ConvertAll
返回列表,您就不需要保留原始列表。Select
是一种LINQ扩展方法,适用于所有IEnumerable
对象,而ConvertAll
仅由list
实现。ConvertAll
方法从.NET2.0开始就存在,而LINQ是在3.5中引入的
您应该更喜欢
Select
而不是ConvertAll
,因为它适用于任何类型的列表,但它们基本上都是一样的。我知道这有点晚了,但我仍然添加了它,因为这可能在将来对其他列表有所帮助
在EntityFramework查询表达式中使用它时,不建议使用ConvertAll(),因为它会计算表达式,而不是将其保留为表达式供将来使用。这会严重降低数据库查询执行性能,因为它必须在计算最终表达式之前进行多次调用 第一个答案不应该是被接受的答案。我曾是2007年微软的MVP 与公认的响应相比,
ConvertAll
比Select
和ToList()
的组合更有效
首先,ConvertAll
的速度要快得多,而且它使用的内存量最少。与Array.ConvertAll与Select和ToArray相同。对于长度更大的数组或循环中的许多调用,这将是一个更明显的问题
1) ConvertAll
知道最终列表的大小,避免重新分配基数组ToList
()将多次调整数组大小
2) ToList
将执行较慢的接口IEnumerable
调用,而ConvertAll
将在底层数组中循环,而无需额外调用或范围检查
3) 选择将创建一个额外的
IEnumerable
对象。性能如何?如果我有一个列表,那么使用ConvertAll或Select是否更有效?@Nicolas:总执行时间大致相同,但它们的处理方式不同,因此适合不同的情况。我在回答中添加了一些内容。您无法比较Select
和ConvertAll
。前者选择序列中的每一项,你可以随意使用它。后者有一个明确的意图:将此项转换为其他项。Exists->Any,Find->First,FindAll->Where,FindLast->Last,TrueForAll->ALL ConvertAll和Select is ConvertAll之间的差异将分配当前列表的大小。对于大型序列,这将产生性能差异。因此,如果性能是您的目标,请使用ConvertAll。如果性能不是一个问题,请使用Select,因为它在语言中更为惯用,并告诉未来的读者性能不是一个问题。您不需要。ConvertAll()之后的ToList()。从未听说过ConvertAll,今天了解了一些新的内容。正如Guffa指出的,ConvertAll
。当您拥有该列表时,您已经计算了表达式。但是你是对的-如果你不想计算所有的值,Select
是更好的选择。可以说,你永远不必“保留原始列表”:它将根据GC的需要来完成。@user2864740:是的,如果源严格地说是内存中的列表,这是正确的。如果它是从例如文件中读取的,则您需要保持该文件处于打开状态,直到您处理了选择
的结果。这不再正确/准确。请参见As侧注VS2019,以全部替换Select+ToList