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);