我有一个代码:
byte[][][] file = GetConfigData();
if (file == null)
return;
int pages = 0;
for (i = 0; i < file.Length; i++)
{
if (file[i] != null)
{
for (j = 0; j < file[i].Length; j++)
{
if (file[i][j] != null)
{
pages++;
}
}
}
}
如何简化它?
请提供2个版本:
答案 0 :(得分:5)
我不熟悉.NET 2.0,但我可以为您提供一些.NET 3.5 Linq查询。
这是:
pages = (from i in file
where i != null
from j in i
where j != null
select j).Count();
但是正如你所看到的那样,并且正如Will Dean所说,即使它更简单,也不会让它更容易理解。 我想补充一点,当你在代码简化方面走得太远时,你也可能在代码不可读性方面走得更远。
我更喜欢有意义且易于阅读的代码,以及更强大和更短的代码,因为随着时间的推移,硬件得到改进,因此编写良好且易于阅读的代码将更快并且易于维护,但更短且难以理解的代码将保留不可读。
答案 1 :(得分:3)
如果您的意思是“我怎样才能让它更容易理解”,那么我的第一个建议就是使用更有意义的变量名称。
它会更长但更简单。
您也可以使用'foreach'代替'for' - 无论如何都会丢失一些索引变量。
最后你可以使用一些毛茸茸的linq系列以功能性的方式完成所有这些,但在任何初学者的意义上都不会“简单”。
答案 2 :(得分:2)
这是我重写代码的镜头。我对变量的命名感到困惑,因为我基本上不知道数组代表什么,但是将名称更改为在您的域中有意义的东西,我会说这比原来的更容易阅读:)
byte[][][] file = GetConfigData();
if (file == null)
return;
var existingFiles = files.Where(file => files != null);
var pages = existingFiles.Count(subFile => subFile != null);
答案 3 :(得分:1)
static void Main(string[] args)
{
byte[][][] files = new byte[][][]
{
new byte[][] { new byte[] { 0x1, 0x2 }, null, new byte[] { 0x3, 0x4 } },
new byte[][] { null, new byte[] { 0x5, 0x6 }, new byte[] { 0x7, 0x8 } },
new byte[][] { null, null, new byte[] { 0x9, 0x10 } },
new byte[][] { null, null, null },
};
var pages = Test(files); // 5
}
static int Test(byte[][][] files)
{
return files.SelectMany(f => f).Count(b => b != null);
}
答案 4 :(得分:0)
您可以更改GetConfigData
以返回字节数组以外的内容吗?我猜测字典会更容易使用。
如果您使用continue
关键字来减少其中的嵌套数量,则代码更易于管理,因为使用continue
明确告诉读者在这种情况下我们应该跳到下一次迭代。
除非您知道基础数据始终具有值,否则无法删除空检查。
byte[][][] file = GetConfigData();
if (file == null)
return;
int pages = 0;
foreach (var xxx in file)
{
if (xxx == null)
continue;
foreach (var yyy in xxx)
{
if (yyy == null)
continue;
pages++;
}
}
我刚使用xxx
和yyy
作为变量的占位符名称,因为我不确定它们代表什么。