我尝试了最好的水平来编写改进的版本,但失败了。
inFiles.ToList().ForEach(i =>
{
filePath = inFolder + "\\" + i.Value;
if (i.Key.Equals(replacementFile))
{
replacementCollection = GetReplacementDataFromFile(filePath);
}
else if (i.Key.Equals(standardizationFile))
{
standardizationCollection = GetStandardizationDataFromFile(filePath);
}
});
问题是我不能在这里使用开关案例,因为比较变量不是常数。
请帮助改进此代码。
我正在使用C#(3.0)。
由于
答案 0 :(得分:9)
你拥有的代码没有过多的if。
您似乎有三种可能性:属于替代品,属于标准化,属于这两者。你拥有的是一种有效,可读的方法。
我会保持原样。
答案 1 :(得分:1)
如果你有很大的逻辑,你可以使用Replace Conditional with Polymorphism重构。
答案 2 :(得分:0)
好的,这是另一次尝试(仍然没有明确的if语句!):
inFiles.ToList().ForEach(i =>
{
filePath = inFolder + "\\" + i.Value;
replacementCollection = testForReplacement(i,filePath,replacementFile);
standardizationCollection = testForStandardization(i,filePath,standardizationFile);
someOtherCollection_1 = testForOtherCollection(i,filePath,otherFile);
....//more statements like this...
});
...
...
...
Collection testForReplacement(i,filePath,testFile)
{
return i.Key.Equals(testFile) ? GetReplacementDataFromFile(filePath) :null;
}
Collection testForStandardization(i,filePath,testfile)
{
return i.Key.Equals(testFile) ? GetStandardizationDataFromFile(filePath) :null;
}
Collection testForSomeOtherCollection(i,filePath,testfile)
{
return i.Key.Equals(testFile) ? GetOtherDataFromFile(filePath) :null;
}
...///more functions like this...
这是比实际代码更多的伪代码(不确定这将按原样编译)但我希望它能说明问题。 ;)
这段代码看起来很冗余,但很容易编写一个脚本/宏,它可以列出所有可能的文件类型,并在模式发生变化时生成(或重新生成)所有必要的函数和语句来使用它们。如果你做得对,生成的代码可以节省大量的时间!
答案 3 :(得分:0)
您似乎在寻找列表中的替换文件或标准化文件中的最后一个元素。
我不确定如果集合中有多个相同类型的文件会发生什么......
这不如你必须两次通过列表那样有效..但也许它更具表现力,如果文件列表很小,也许只是一个过早的优化问题!
inFiles.Where(i => i.Key.Equals(replacementFile)).ToList().ForEach( i =>
{
replacementCollection = GetReplacementDataFromFile(Path.Combine(inFolder, i.Value));
}
inFiles.Where(i => i.Key.Equals(standardizationFile)).ToList().ForEach( i =>
{
standardizationCollection = GetStandardizationDataFromFile(Path.Combine(inFolder, i.Value));
}
答案 4 :(得分:0)
非常易读,我不知道你希望通过删除if获得什么。我会保持原样,但可能会添加一个最终的else而不是仅仅结束方法。这可能会抛出异常或记录一些信息。
答案 5 :(得分:0)
如果inFiles是一个字典,你可以这样做:
replacementCollection =
inFiles.ContainsKey(replacementFile) ?
GetReplacementDataFromFile(
Path.Combine(inFolder, inFiles[replacementFile]) ) : null;
standardizationCollection =
inFiles.ContainsKey(standardizationFile) ?
GetStandardizationDataFromFile(
Path.Combine(inFolder, inFiles[standardizationFile]) ) : null;
如果你的GetReplacementDataFromFile,GetStandardizationDataFromFile可以优雅地处理空字符串参数,你可以缩短它:
string value;
replacementCollection =
GetReplacementDataFromFile(
inFiles.TryGetValue(replacementFile, out value) ? Path.Combine(inFolder, value) : string.Empty );
standardizationCollection =
GetStandardizationDataFromFile(
inFiles.TryGetValue(standardizationFile, out value) ? Path.Combine(inFolder, value) : string.Empty );
答案 6 :(得分:-2)
我的版本:
foreach(var file in inFiles)
{
filePath = Path.Combine(inFolder, file.Value);
if(file.Key.Equals(replacementFile))
{
replacementCollection = GetReplacementDataFromFile(filePath);
// ATTENTION ATTENTION LOOP CONTINUATION STATEMENT FOLLOWS
continue;
// THIS CONCLUDES OUR USE OF THE LOOP CONTINUATION STATEMENT
}
if (file.Key.Equals(standardizationFile))
standardizationCollection = GetStandardizationDataFromFile(filePath);
}
不确定为什么要使用ToList和ForEach,但它根本不会提高可读性。此外,您的路径连接很糟糕。始终使用Path类型执行文件路径操作。我也不喜欢堆叠if语句,所以我通常使用gate语句;我将退出/快捷方法或循环而不是else if
。有些人认为这是一种不好的做法(单一入口,单一退出逻辑)但我认为它们已经充满了它。