2012-04-04 8 views
0
Microsoft.Win32.RegistryKey registryPath = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Testing"); 

Microsoft.Win32.RegistryKey entryKey = registryPath.OpenSubKey("Entry Point"); 

"Entry Point 011"、 "Entry Point 123"という形式でテスト中に多くのキーがあります。C#部分的な値を使用して存在するレジストリキーをカウントする

上記のregistryPath変数を検索し、「エントリポイント」キーワードを含むキーの数を取得できますか?このキーワードなしで他のキーも存在すると仮定します。

現時点では、すべてのキーの数を得るためにすべての可能な組み合わせについてループとループを使用していますが、キーが存在するかどうかをチェックしていますが、 "Entry Point 9000" forループを9000回実行することは非常に非効率的である。それは9000まで(例えばのために)カウントされますが、そこになる場合どのよう

for (int i = 0; i <= highestEntryPointValue; i++) 
{ 
    Microsoft.Win32.RegistryKey entryKey = steamApps64.OpenSubKey("Entry Point " + Convert.ToString(i)); 

    if (entryKey != null) 
    { 
     count++; 
    } 
} 

答えて

1

Microsoft.Win32.RegistryKeyには、名前の付いた文字列の配列を返すGetSubKeyNames()というメソッドがあります。

string[] keys = registryPath.GetSubKeyNames(); 

は今、あなたが無駄レジストリに開放せずに

var subKeys = Array.FindAll(keys, key => key.Substring(0, 11) == "Entry Point")); 
int count = subKeys.Lenght; 
foreach(string s in subKeys) 
..... 
+0

私はこの方法が気に入っていますが、唯一問題となるのは、項目の数を取得した後で、上記のいずれのキーにも含まれていない文字列値を抽出することです。サブキー名が配列になっているので、既存のキー変数の末尾にサブキー名をループして、その中のエントリを取得することができます...これを実行します:) – cheeseman

2

この例では、効率的ではありませんだけで3エントリーポイント011、エントリーポイント123、エントリーポイントキー9000

一行答え

int count = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Testing").GetSubKeyNames().Where(s => s.StartsWith("EntryPoint")).Count(); 
+0

おかげで自分の名前をこれらのキーのループとを確認することができ、私が最後にそこに回答の組み合わせを使用して終了しました。 – cheeseman

関連する問題