我在不太明白的帖子上发现了这段代码,并且会让某人解释。
private bool[] GetPageNumbersToLink(IPagedResult result)
{
if (result.TotalPages <= 9)
return new bool[result.TotalPages + 1].Select(b => true).ToArray();
...
C# Array initialization - with non-default value
我对此的看法:
new bool[result.TotalPages + 1]
这会创建一个bool数组,其长度等于totalpages的长度,默认值为false。
.Select(b => true)
这使用linq查询只返回true的项,即没有它们
.ToArray();
linq返回IEnumerable或其他东西,因此它需要返回一个长度为0的新数组,因为首先没有选择它。
我认为这就是它正在做的事情,但它没有任何意义。
答案 0 :(得分:8)
(编辑:哎呀,误读了帖子(除非在没有我注意的情况下进行编辑)。)
不,这不是它正在做的事情。结果是有效的:
Enumerable.Repeat(true, result.TotalPages + 1).ToArray();
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();
无论如何它效率低下。偶尔不幸的是.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;
}
答案 1 :(得分:5)
.Select(b => true)
这使用linq查询只返回true的项,即没有它们
不,这意味着对于每个项目,它返回true。它不对数组项的值进行任何测试
此代码只创建一个包含所有项目设置为true的数组
我更喜欢这种形式(没有中间数组):
return new Enumerable.Range(0,result.TotalPages).Select(b => true).ToArray();
答案 2 :(得分:2)
我相信.Select(b =&gt; true)部分会为数组中的每个元素返回“true”,所以你实际上使用result.TotalPages + 1项获得IEnumerable,然后将它转换为数组。