如何使用只接受一个项目的C#方法快速解析列表



我自己在学习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,因为xdouble数组

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 * 20来过滤列表

var filtered = x.Where(y => myMethod(y)).ToList();

或CCD_ 21转换列表

var converted = x.Select(y => myMethod(y)).ToList();

最新更新