2010-12-16 47 views
0

我已经写了一段代码,我绝对认为它没有写出正确的方式。 我的方法必须根据安装在我的机器上的Adobe版本返回一个字符串。需要帮助改进现有的代码段

private string GetRegistryKeyPathForX() 
     { 
      string sPath = string.Empty; 
      RegistryKey adobe = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Adobe"); 
      if (adobe != null) 
      { 
       RegistryKey acroRead = adobe.OpenSubKey("Adobe Acrobat"); 
       if (acroRead != null) 
       { 
        string[] acroReadVersions = acroRead.GetSubKeyNames(); 
        //The following version(s) of Acrobat Reader are installed 
        foreach (string versionNumber in acroReadVersions) 
        { 
         switch(versionNumber) 
         { 
          case "6.0": sPath = "Software\\Adobe\\Acrobat Reader"; 
             return sPath; //Improve here 
             break; 

          case "7.0": 
             sPath = ""; 
             return sPath; //Improve here 
             break; 
          case "8.0": 
             sPath = ""; 
             return sPath; //Improve here 
             break; 
          case "9.0" : 
             sPath = "Software\\Adobe\\Acrobat Reader"; 
             return sPath; //Improve here 
             break; 
          default: sPath = "ERR_KEY"; 
              break; 
         } 
        } 
       } 
      } 
     return sPath; 
    } 

有没有一种办法,这样我可以一次性返回字符串,而不是在所有情况下语句中给它的?

回答

1

,可随时更换循环和switch本:

if (acroRead.GetSubKeyNames().ToList().FindAll(versionNumber => versionNumber.Equals("6.0") || versionNumber.Equals("9.0")).Count > 0) 
    return "Software\\Adobe\\Acrobat Reader"; 

编辑:.NET版本2:

if (Array.FindAll<string>(acroRead.GetSubKeyNames(), delegate(string versionNumber) { return versionNumber.Equals("6.0") || versionNumber.Equals("9.0"); }).Length > 0) 
+0

谢谢...这工作,但我不允许使用Linq查询:(在2.0框架中。 – 2010-12-16 12:29:23

+0

@这个我很公平,更新我的答案与“纯2.0”代码以及。:) – 2010-12-16 12:45:06

+0

你是男人 !! – 2010-12-16 14:47:44

2

是:你不需要任何转让或break声明:

case "6.0": return "Software\\Adobe\\Acrobat Reader"; 

如果你能得到的ReSharper副本是否能真正与这样的事情帮助:在这种情况下,它会将未使用的代码break突出显示为灰色,并且它会提供自动删除作业。

1

无需编写break;,因为它是从那里返回值

switch(versionNumber) 
{ 
    case "6.0": return "Software\\Adobe\\Acrobat Reader"; 
    . 
    . 
    . 
} 

或switch语句之后回报

switch(versionNumber) 
{ 
    case "6.0": sPath = "Software\\Adobe\\Acrobat Reader";   
     break; 
    . 
    . 
    . 
} 
return sPath; 
+0

感谢这有助于以及! – 2010-12-16 12:19:56

6

如果你只是优化开关,你可以写:

switch(versionNumber) 
{ 
    case "6.0": 
    case "9.0": 
     return "Software\\Adobe\\Acrobat Reader"; 
    case "7.0": 
    case "8.0": 
     return string.Empty; 
    default: 
     return "ERR_KEY"; 
} 

然而,我更喜欢使用的地图,而不是开关(尤其是如果你需要在多个地方这个逻辑),所以你可以这样做:

Dictionary<string, string> versionPaths = new Dictionary<string, string>(); 
versionPaths.Add("6.0","Software\\Adobe\\Acrobat Reader"); 
versionPaths.Add("7.0",string.empty); 
.... 
if (versionPaths.ContainsKey(versionNumber)) 
    return versionPaths[versionNumber]; 
else 
    return "ERR_KEY"; 
0
private string GetRegistryKeyPathForX() 
{ 
    var adobe = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Adobe"); 
    if (adobe == null) 
    { 
     return string.Empty; 
    } 

    RegistryKey acroRead = adobe.OpenSubKey("Adobe Acrobat"); 
    if (acroRead == null) 
    { 
     return string.Empty; 
    } 

    string[] acroReadVersions = acroRead.GetSubKeyNames(); 

    //The following version(s) of Acrobat Reader are installed 
    foreach (string versionNumber in acroReadVersions) 
    { 
     switch (versionNumber) 
     { 
      case "6.0": return "Software\\Adobe\\Acrobat Reader"; 
      case "7.0": return ""; 
      case "8.0": return ""; 
      case "9.0": return "Software\\Adobe\\Acrobat Reader"; 
      default: break; 
     } 
    } 

    return "ERR_KEY"; 
}