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