将重复的循环功能提取到自己的方法中

时间:2018-11-12 09:15:20

标签: c#

在我的一个类中,我有许多方法都具有相似的用途。这些方法将不同的对象转换为有效的JSON表示形式。每种方法的作用都稍有不同,因为要馈入该方法的对象不同,因此它们的JSON输出也将有所不同。

在这些方法中,存在for循环,该循环的目的是检查要转换为JSON的字段是否是对象中的最后一个,如果不是,则将放置,转换后的JSON字符串之后,就像JSON中一样。

下面是其中一个for循环的示例:

         for (int i = 0; i < numberOfSections; i++)
            {
                if (i == numberOfSections - 1)
                {
                     output += SectionToJson(root.Sections[i]);
                }
                else
                {
                    output += SectionToJson(root.Sections[i]);
                    output += ",";
                }
            }

这里要注意的一件事是,每个方法中对方法的调用(此处为SectionToJson)是不同的。因此,我有三个不同的for循环,它们执行几乎相同的操作,但在其子句中使用不同的方法调用。

我想知道是否有一种方法可以从我的三个不同方法中删除这些难看的for循环,而是将其功能放在单个方法中,然后可以从这三个方法中调用它们。但是,由于内部方法的调用在每个方法中都不同,因此,将其放置在单个方法中变得更加困难。

我考虑过使用Func委托将所需的方法作为参数传递给新方法,但是由于三个内部方法的参数都不同,因此无法使用,因此我需要对a进行三个不同的覆盖单一方法。哪一种会破坏首先删除for循环的目的。

还有没有其他我认为没有帮助我实现目标的方法?我还试图使参数列表保持不变,而不希望在新方法中遍历三个参数。最好是两个。

其他两个for循环如下。

for (int i = 0; i < numberOfQuestionsInBank; i++)
            {
                if (i == numberOfQuestionsInBank - 1)
                {
                    output += QuestionPropertyToJson(questionBank.Properties[i]);
                }
                else
                {
                    output += QuestionPropertyToJson(questionBank.Properties[i]);
                    output += ",";
                }

            }

for (int i = 0; i < numberOfSections; i++)
            {
                if (i == numberOfSections - 1)
                {
                    requiredSections += "\"" + (i+1) + "\"";
                }
                else
                {
                    requiredSections += "\"" + (i+1) + "\"";
                    requiredSections += ",";
                }


            }

2 个答案:

答案 0 :(得分:2)

嗯,还有另一种方法-使用fixture `My fixture` .page `http://example.com` .httpAuth({ username: 'username', password: 'Pa$$word', // Optional parameters, can be required for the NTLM authentication. domain: 'CORP-DOMAIN', workstation: 'machine-win10' }); test('Test1', async t => {}); // Logs in as username test // Logs in as differentUserName .httpAuth({ username: 'differentUserName', password: 'differentPa$$word' }) ('Test2', async t => {}); 就是这样做的。

当然可以使用linq使其看起来非常漂亮:

string.Join

string.Join(",", root.Sections.Select(SectionToJson)) 接受字符串的集合,因此您将注意力集中在转换为字符串(对于每个元素)上,然后让它为您进行串联。

答案 1 :(得分:0)

针对您的问题的实际解决方案是使用JSON序列化程序,但这当然是一个练习,因此我们可以对其进行一些不同的处理。

我们需要做的是看一下代码,找到最相似的部分。找到代码的那一部分后,我们需要使其变得更相似。一旦它们相同,我们就可以删除重复项。 They both remain 'til they're both the same

因此,首先,我们稍微更改两个功能,以移动与几乎相同的部分不同的部分。您可以看到两者中的if语句开始看起来非常相似。

        for (int i = 0; i < numberOfQuestionsInBank; i++)
        {
            output += QuestionPropertyToJson(questionBank.Properties[i]);

            if (i != numberOfQuestionsInBank - 1)
            {
                output += ",";
            }
        }

        for (int i = 0; i < numberOfSections; i++)
        {
            requiredSections += "\"" + (i + 1) + "\"";

            if (i != numberOfSections - 1)
            {
                requiredSections += ",";
            }
        }

现在让我们考虑一下命名相同的情况。注意:我并不是说您应该在所有地方都使用相同的命名方式,因为这样会使您的代码表达能力降低-但是我们可以在头脑中进行此练习...

        for (int i = 0; i < recordCount; i++)
        {
            output += QuestionPropertyToJson(questionBank.Properties[i]);

            if (i != recordCount - 1)
            {
                output += ",";
            }
        }

        for (int i = 0; i < recordCount; i++)
        {
            output += "\"" + (i + 1) + "\"";

            if (i != recordCount - 1)
            {
                output += ",";
            }
        }

该部分:

        if (i != recordCount - 1)
        {
            output += ",";
        }

现在两者都相同...我们可以为此创建一个函数。有几种方法可以做到,这只是其中一种:

    public string ConditionalComma(int recordCount, int i)
    {
        if (i != recordCount - 1)
        {
            return ",";
        }

        return string.Empty;
    }

这意味着我们的方法现在如下所示(我将保留标题中的名称):

        for (int i = 0; i < recordCount; i++)
        {
            output += QuestionPropertyToJson(questionBank.Properties[i]) + ConditionalComma(recordCount, i);
        }

        for (int i = 0; i < recordCount; i++)
        {
            output += "\"" + (i + 1) + "\"" + ConditionalComma(recordCount, i);
        }

因此,我们设法提取出差异并以明智的方式删除了重复项。

对于本练习来说,这可能已经足够了,但是请随时提出问题。