Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# C中Select和ConvertAll的区别#_C#_.net_List - Fatal编程技术网

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