IEnumerable / Enumerable with Double / Int;初学者

时间:2017-03-12 08:38:45

标签: c# .net ienumerable enumerable

我是来自python的C#的新手,即使在阅读过MSDN文档之后,我也不清楚IEnumerable对象的确切行为。

例如,IEnumerable需要一个int,但以下代码可以正常工作:

IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => Math.Pow(x, 2));

然而,

IEnumerable<double> square_ = Enumerable.Range(1, 100);

抛出编译错误,你不能隐式转换类型&#39; System.Collections.Generic.IEnumerable int&#39; to&#39; System.Collections.Generic.IEnumerable double&#39;

我不确定这是否只是对Enumerable如何工作,对象如何在C#中工作或其他完全不同的基本误解,并且非常感谢帮助和一些关于在哪里阅读新手的指导得到一个更好的主意。

非常感谢提前。

4 个答案:

答案 0 :(得分:2)

由于Math.Pow会返回double,因此.Select(x => Math.Pow(x, 2));会返回IEnumerable<double>,因此确切地说是您声明的类型。

Enumerable.Range会返回与IEnumerable<int>不兼容的IEnumerable<double>

显然你可以:

IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => (double)x);

这会将Enumerable.Range的单个元素强制转换为double,方法是使用lambda函数int -> double(来自int x的函数返回double

答案 1 :(得分:0)

如果你看一下Math.Pow的定义,你会发现它会返回一个双倍。

因此,

.Select(x => Math.Pow(x, 2))

projectingIEnumerable<double>

答案 2 :(得分:0)

嗯,这只是返回类型的问题:

Enumerable.Range(1, 100);返回IEnumerable<int>检查MSDN: Enumerable.Range

Math.Pow返回double,检查here

您正在尝试设置IEnumerable<double>类型,因此Enumerable.Range(1, 100)无效。

使用Linq,您可以使用intsdoubles投射到Select(x => Math.Pow(x, 2)),然后返回IEnumerable<double>

答案 3 :(得分:0)

Enumerable.Range(1,100);

返回IEnumerable值

Math.Pow(x, 2)

返回Double。

因此,当您尝试第一个选项时,会出现转换错误(您的var需要IEnumerable,或者只是Double类型,而是获取IEnumerable)。

你可以试试像

这样的东西
IEnumerable<double> squares = (IEnumerable<double>)Enumerable.Range(1, 100);