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

C# 将重复for循环功能提取到自己的方法中,c#,C#,在我的一个类中,我有许多方法,它们都有相似的目的;这些方法将不同的对象转换为有效的JSON表示。每个方法做的事情稍有不同,因为输入到方法中的对象不同,因此它们的JSON输出也会有细微的不同 在这些方法中存在for循环,此循环的目的是检查转换为JSON的字段是否是对象中的最后一个字段,如果不是,则将在转换后的JSON字符串后放置一个,,这在JSON中是正常的 下面是其中一个for循环的示例: for (int i = 0; i < numberOfSections; i++

在我的一个类中,我有许多方法,它们都有相似的目的;这些方法将不同的对象转换为有效的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 += ",";
                }
            }

for(int i=0;i
嗯,还有另一种方法-使用
字符串。Join
这正是它所做的

当然,使用linq,您可以让它看起来非常漂亮:

string.Join(",", root.Sections.Select(SectionToJson))

string.Join
接受字符串集合,因此您可以集中精力转换为字符串(对于每个元素),并让它为您进行连接。

解决问题的实际方法是使用JSON序列化程序,但当然这是一个练习,因此我们可以稍微不同地对待它

我们需要做的是查看代码并找到最相似的部分。一旦我们找到了代码的这一部分,我们需要使它更加相似。一旦它们完全相同,我们就可以删除重复项

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

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

            if (i != numberOfQuestionsInBank - 1)
            {
                output += ",";
            }
        }
现在两者都相同了。。。我们可以为此创建一个函数。有几种方法可以做到这一点,这只是其中之一:

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

        return string.Empty;
    }
这意味着我们的方法现在看起来像这样(我将保留头中的命名):

for(int i=0;i

for(int i=0;i
因此,我们设法以合理的方式提取差异并消除重复


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

您是否正在构建自己的JSON序列化程序?如果没有,为什么要重新发明轮子?DataContractJsonSerializer或NewtonSoft Json nuget可能是。不幸的是,在这种情况下,我必须自己构建Json。实际上,我正在使用这段代码从input.Perfect构建JSON模式文件。这大大减少了我的代码,我甚至可以精简第四种使用foreach的方法。非常感谢。使用上面的答案,我成功地减少了我的代码。但是你的帖子在找出如何使方法相同方面很有见解,所以谢谢你。
        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);
        }