C# OOC:ToList()和casting to List有什么区别<;T>;在.NET中?

C# OOC:ToList()和casting to List有什么区别<;T>;在.NET中?,c#,collections,casting,C#,Collections,Casting,出于好奇 因此,作为一个小练习,为了学习,我决定检查是否能够实现一个非常基本的递归函数,该函数将返回一个列表,但有以下限制: 1-结果应由函数本身返回(而不是作为参数传递给void函数) 2-函数体中未声明局部“命名”变量 我提出了下面的解决方案(顺便说一句:这能以任何方式改进吗?) 在这样做的过程中,我了解到ToList()与转换到列表(参见下面的示例)不是一回事-有谁能解释引擎盖下发生了什么以及两者之间的区别 谢谢 PS-我使用的是4.0版(以防万一) 编辑:运行时错误是无法将类型为'd_u

出于好奇

因此,作为一个小练习,为了学习,我决定检查是否能够实现一个非常基本的递归函数,该函数将返回一个
列表
,但有以下限制:

1-结果应由函数本身返回(而不是作为参数传递给
void
函数)

2-函数体中未声明局部“命名”变量

我提出了下面的解决方案(顺便说一句:这能以任何方式改进吗?)

在这样做的过程中,我了解到
ToList()
与转换到
列表
(参见下面的示例)不是一回事-有谁能解释引擎盖下发生了什么以及两者之间的区别

谢谢

PS-我使用的是4.0版(以防万一)

编辑:运行时错误是
无法将类型为'd_u71'1[System.Int32]'的对象强制转换为类型为'System.Collections.Generic.List'1[System.Int32]'

public static List<int> SomeIntegers(int min, int max)
{
    //assume max >= min for simplicity  
    if (min == max)
        return new List<int>() { min };

    // runtime error 
    //return (List<int>)(SomeIntegers(min, max - 1).Concat(new List<int>() { max }));   

    //works
    return (SomeIntegers(min, max - 1).Concat(new List<int>() { max })).ToList(); 
}
公共静态列表一些整数(int-min,int-max)
{
//为简单起见,假设max>=min
如果(最小值==最大值)
返回新列表(){min};
//运行时错误
//return(List)(一些整数(min,max-1).Concat(newlist(){max}));
//工作
return(SomeIntegers(min,max-1).Concat(newlist(){max})).ToList();
}
ToList()
与(铸造)列表不同

ToList()
获取任何
IEnumerable
(列表、数组、词典、集合等),并将其转换为
列表

强制转换到
列表
将获取已经是某种列表的对象,并将其标记为列表。例如:

// fail -- arrays are not lists
var not_a_list = (List<int>)int[];
// success: arrays *are* IEnumerable, so you can convert them to a list.
var list_from_array = new [] { 1,2,3,4,5 }.ToList();
// success: WorkflowRoleCollection derives from List<WorkflowRole>
var derived_from_list = (List<WorkflowRole>) new WorkflowRoleCollection();
//失败--数组不是列表
var not_a_list=(list)int[];
//成功:数组*是*IEnumerable,因此可以将它们转换为列表。
var list_from_array=new[]{1,2,3,4,5}.ToList();
//成功:WorkflowRoleCollection从列表派生
var派生自_list=(list)new WorkflowRoleCollection();
在您的情况下,
Concat()
返回一个
IEnumerable
,而不是
列表。请记住,它必须支持生成器(这些生成器是惰性的),所以它下面的列表是没有意义的

顺便说一句,你有没有看过内置的函数
可枚举.Range

  • 仅当您实际拥有
    列表
    、从
    列表
    派生的内容或具有有效类型转换到
    列表
    的内容时,强制转换才有效,否则它会因
    无效强制转换异常
    而失败
    ToList()
    适用于任何IEnumerable
  • ToList()
    始终创建列表的新副本,即使您已经有一个列表。将某个内容强制转换到
    列表
    通常不会生成列表的副本-它只会为同一对象提供一个新的编译时类型

顺便说一句,生成整数列表的最佳方法是:

Enumerable.Range(min, length);


但这无助于你的学习,所以我为你感到荣幸!:)

谢谢,我刚查过这个;所以我们似乎没有得到一个
Enumerable.Range(min,max,step)
Enumerable.Range(min,max,x=>x*x)
,对吧?不是直接的,但是你当然可以做一些类似
Enumerable.Range(min,length)的事情。其中(x=>(x-min)%step==0)
Enumerable.Range(min,length)。选择(x=>x*x)
以获得Thoseal的等效值,请注意Enumerable.Range上的第二个参数是LENGTH,而不是MAX
Enumerable.Range(min, max-min+1);