我发现这个代码片段在一个我不太了解的不同帖子上,并且会让某人解释.
private bool[] GetPageNumbersToLink(IPagedResult result)
{
if (result.TotalPages <= 9)
return new bool[result.TotalPages + 1].Select(b => true).ToArray();
...
Run Code Online (Sandbox Code Playgroud)
我对此的看法:
new bool[result.TotalPages + 1]
Run Code Online (Sandbox Code Playgroud)
这会创建一个bool数组,其长度等于totalpages的长度,默认值为false.
.Select(b => true)
Run Code Online (Sandbox Code Playgroud)
这使用linq查询只返回true的项,即没有
.ToArray();
Run Code Online (Sandbox Code Playgroud)
linq返回IEnumerable或其他东西,因此需要返回一个长度为0的新数组,因为首先没有选择任何数组.
我认为这就是它正在做的事情,但它没有任何意义.
(编辑:哎呀,误读了帖子(除非在没有注意的情况下进行编辑).)
不,这不是它正在做的事情.结果是有效的:
Enumerable.Repeat(true, result.TotalPages + 1).ToArray();
Run Code Online (Sandbox Code Playgroud)
该Select调用不取决于它的选择,在所有的价值-它只是返回true无论输入.Select不执行过滤,只是投影.
换一种说法:
// Array filled with (result.TotalPages + 1) x false
new bool[result.TotalPages + 1]
// Sequence of length (result.TotalPages + 1) x true
.Select(b => true)
// Array filled with (result.TotalPages + 1) x true
.ToArray();
Run Code Online (Sandbox Code Playgroud)
无论如何它效率低下.偶尔不幸的是.NET没有提供类似的东西:
public static T[] CreateFilledArray<T>(T value, int size)
{
T[] ret = new T[size];
for (int i=0; i < size; i++)
{
ret[i] = value;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
.Select(b => true)这使用linq查询只返回true的项,即没有
不,这意味着对于每个项目,它返回true.它不对数组项的值进行任何测试
此代码只创建一个所有项都设置为true的数组
我更喜欢这种形式(没有中间数组):
return new Enumerable.Range(0,result.TotalPages).Select(b => true).ToArray();
Run Code Online (Sandbox Code Playgroud)