我自己在学习C#,我想知道C#方法是否能像Python那样快速解析值列表,如下所示:
def myMethod(somevalue):
return somevalue * 2
x = [1,2,3,4,5]
a = [myMethod(i) for i in x]
目前,我正在尝试创建一个类,它有一个接受double的方法。但是如果x是一个列表呢?
class myClass
{
public double somevalue;
public myClass(double someValue)
{
somevalue = someValue;
}
public double myMethod()
{
return somevalue * 2;
}
}
myClass output = new myClass(x);
A = output.myMethod();
我的问题是,C#是否可以创建非常简洁的代码,使Method接收列表,在列表中循环并给出结果列表?
不是python专家,但这是:
def myMethod(somevalue):
return somevalue * 2
x = [1,2,3,4,5]
a = [myMethod(i) for i in x]
看起来在C#中是这样的:
//either:
double TimesTwo(double d) => d * 2; //a method declaration that is "expression bodied" style
//or:
double TimesTwo(double d) { return d * 2; } //a method declaration that is "normal" style
void SomeOtherMethod(){ //these statements can't just be floating around in a namespace like the method declarations above, they have to be inside some other method
var x = new[] {1d,2,3,4,5}; //the first element is a double (1d), the others will be promoted from int to double without needing an explicit cast, the whole array x is a double[]
var a = x.Select(TimesTwo).ToArray();
}
您可以跳过为* 2
操作创建单独的方法(上面的方法称为TimesStwo(,只需将您想要的逻辑内联:
var x = new[] { 1d,2,3,4,5 };
var a = x.Select(p => p * 2).ToArray();
CCD_ 2有点像";内联方法"-我们称它们为lambdas;输入自变量被称为p
,其类型是根据调用.Select
的集合的类型推断的。在这种情况下,会推断出double
,因为x
是double
数组
return
关键字不是在单行lambda中指定的(我们称之为表达式体某物(;=>
之后的单行代码(在p => ...
和TimesTwo(int i) => ...
中(是解析为一个值的语句,并且该值被隐式返回。在这种情况下,语句p => p * 2
将输入p
乘以2,结果自动返回。
.Select
方法的结果是可枚举的(特别是IEnumerable<double>
类型,ToArray()
方法会枚举它并将其转换为数组。正是ToArray的调用导致p*2
在每个成员上被调用,ToArray收集所有结果并输出数组
所有这些代码都来自System.Linq
命名空间中的扩展方法,因此您的代码需要位于顶部的using System.Linq;
一个重要的点,很可能在未来的某个时候发生;如果Select的可枚举输出实际上没有枚举,则不执行Select内lambda中的代码。如果你有:
var enumerableThing = oneThousandThings.Select(p => SomeOperationThatTakesOneSecond(p));
它几乎会立即执行;这行代码中没有任何内容枚举生成的可枚举对象,没有为新数组分配内存,没有发生任何内容的循环集合,耗时1秒的操作甚至没有调用过一次,更不用说调用过一千次了。
如果你后来做了一些实际枚举结果的事情,那么操作将花费一千秒:
var arr = enumerableThing.ToArray() //takes 1000s
foreach(var x in enumerableThing) //would take 1000s to finish looping
...
int i = 500;
foreach(var x in enumerableThing){ //would take 500s, the enumeration quitting early after being half done
i--;
if(i == 0) break;
}
这种枚举可以在数小时或数天后完成;它被称为延迟执行,如果你不熟悉,值得进一步研究
您可以使用p => p * 2
0来过滤列表
var filtered = x.Where(y => myMethod(y)).ToList();
或CCD_ 21转换列表
var converted = x.Select(y => myMethod(y)).ToList();