Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何阅读IntelliSense以有效使用LINQ_C#_Linq - Fatal编程技术网

C# 如何阅读IntelliSense以有效使用LINQ

C# 如何阅读IntelliSense以有效使用LINQ,c#,linq,C#,Linq,我是新来C林克的。这是一个关于如何使用IntelliSense有效使用LINQ的一般基本问题。我正在编写一小段代码,以查找文件夹中的平均文件大小。以下几行是代码的一部分 string[] dirfiles = Directory.GetFiles("c:\\orderprocessing\\"); var avg = dirfiles.Select(file => new FileInfo(file).Length).Average(); 这段代码很好用,我是从一个网站上得到的。如果我必

我是新来C林克的。这是一个关于如何使用IntelliSense有效使用LINQ的一般基本问题。我正在编写一小段代码,以查找文件夹中的平均文件大小。以下几行是代码的一部分

string[] dirfiles = Directory.GetFiles("c:\\orderprocessing\\");
var avg = dirfiles.Select(file => new FileInfo(file).Length).Average();
这段代码很好用,我是从一个网站上得到的。如果我必须自己写,我想知道如何找到传递给Select方法的内容。当我将鼠标悬停在它上方时,IntelliSense显示以下内容:

IEnumerable<TResult> IEnumerable<string, TResult>(Func<string, TResult> 
selector) (+ 1 overload)

我想知道如何阅读此建议并提出file=>newfileinfofile.Length来传递给该方法?对不起,如果问题很基本

首先,你可能想知道VS是如何知道该向你展示什么的。这里有XML文档。 在c中,我们有delegatessee。这是一种将方法作为参数传递的方法。让我们考虑一下你的参数:

file => new FileInfo(file).Length
它叫

它作为一种方法展开,称为匿名方法:

像这样的表情

x => expression using x

被称为Lambda表达式。这是一种非常简洁的编写方法的方法,可以在需要的地方作为委托使用。您可以将委托视为可以作为参数传递给另一个方法的函数指针

上面的两个表达式翻译成

resultType HiddenMethodName(parameterType x)
{
    return expression using x;
}

关键是这些类型是由C编译器推断出来的。例如,您只写file=>。。。C知道file是string类型的输入参数,因为您在string数组上调用了Select

。。。结构是否

ReturnType InputType.ExtensionMethod<InputElementType, ResultElementType>(
    function delegate that transforms input to output)
。。。这意味着我们有一个可枚举的数组字符串[]dirfiles。在此输入枚举上,我们在点后应用扩展方法Select

Select需要IEnumerable类型的输入枚举,并返回IEnumerable类型的输出枚举。这是您在开头看到的返回类型。类型TResult在此阶段未知,因为它取决于lambda表达式返回的内容

此Select扩展方法的要点是将输入枚举转换为可能是另一种类型的输出枚举。输入枚举的每个元素的转换由作为lambda表达式给定的委托Func选择器执行

lambda表达式文件=>new FileInfofile.Length有一个字符串输入参数文件,并返回long类型的结果,该文件长度以64位整数形式给出。Average将生成的IEnumerable转换为double


除了@BasilKosovan提供的链接外,您还可以看看尖括号中的内容。

您知道Func吗?它是按项类型划分的Func,因为dirfiles是一个IEnumerable,它将是Func。如果它是IEnumerable,那么它可能是Func?是的,在select TResult中,它是您的输出类型,在本例中为int或long,在其中,First,FirstOrDefault。。。。TResult总是bool,它确定每个对象是否符合您的条件,您甚至可以这样做:Func GetLength=file=>newfileinfofile.Length;然后:var avg=dirfiles.SelectGetLength.Average;我认为上面的例子更清楚。
resultType HiddenMethodName(parameterType x)
{
    return expression using x;
}
resultType HiddenMethodName(parameterType1 x, parameterType2 y, ...)
{
    return expression using x, y, ...;
}
Func<string, TResult> selector
IEnumerable<TResult> IEnumerable<string>.Select<string, TResult>(
    Func<string, TResult> selector)
ReturnType InputType.ExtensionMethod<InputElementType, ResultElementType>(
    function delegate that transforms input to output)