2010-12-16 10 views
0

Ich habe ein Code-Snippet geschrieben, das ich definitiv fühle es ist nicht ein richtiger Weg geschrieben. Meine Methode muss eine Zeichenfolge basierend auf der Version von Adobe Installed auf meinem Computer zurückgeben.Hilfe benötigt, um das vorhandene Code-Snippet zu verbessern

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; 
    } 

Gibt es eine Möglichkeit, so dass ich die Zeichenfolge in einem Schuss zurückkehren kann, anstatt es in jedem Fall Anweisung zuweisen.?

Antwort

1

Sie die Schleife ersetzen und die switch mit diesem:

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

Edit: .NET Version 2:

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

Danke ... das funktioniert auch, aber ich bin nicht berechtigt, Linq Abfragen zu verwenden :(in 2.0 Framework. –

+0

@ this-Me fair genug, aktualisiert meine Antwort mit "pure 2.0" Code auch. :) –

+0

du bist der Mann !! –

2

Ja: Sie brauchen weder die Zuordnung oder die break Aussage:

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

Wenn Sie eine Kopie von ReSharper bekommen können es wirklich mit dieser Art der Sache helfen kann: in diesem Fall wäre es Markieren Sie die nicht verwendete Code-Anweisung break in grau, und es würde angeboten, die Zuweisung automatisch zu entfernen.

1

Keine Notwendigkeit break; zu schreiben, da es Werte von dort

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

ODER Rückkehr nach switch-Anweisung

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

Dank dies auch hilft !! –

6

Wenn Sie nur den Schalter optimieren, zurückkehren könnten Sie schreiben:

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"; 
} 

Allerdings Ich ziehe Karten anstelle von Schaltern (vor allem, wenn Sie diese Logik in mehr als einem Ort brauchen), so könnten Sie tun:

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"; 
}