如何简化代码的这一部分?

时间:2010-07-27 08:13:49

标签: c#

我有一个代码:

    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个版本:

  1. for .net 2.0
  2. for .net 3.5(linq)

5 个答案:

答案 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++;
    }
} 

我刚使用xxxyyy作为变量的占位符名称,因为我不确定它们代表什么。