我们可以避免多个if''s?

时间:2010-05-07 13:45:50

标签: c#-3.0

我尝试了最好的水平来编写改进的版本,但失败了。

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)。

由于

7 个答案:

答案 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。有些人认为这是一种不好的做法(单一入口,单一退出逻辑)但我认为它们已经充满了它。