0

私はプログラミングにかなり慣れていないので、質問があります。ネットワーク上のコンピューターのリストを取得したいのですが、これは正常に実行され、.Count()を使用してコンピューターの数を取得できました...問題は、完全にいくつかの場所があることです。その番号を参照したいコードで、cを使おうとすると、そのコンテキストに変数が存在しないことが通知されます。私は自分のパブリックメソッドを作成しようとしましたが、適切なリターンを入力するように求められ、検索した後です。私はまだそれを理解することができません..誰かが私を正しい方向に向けることができますか?ありがとうございました。

public void ComputersOnNetwork()
{
   List<string> list = new List<string>();
   using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
   {
       foreach (DirectoryEntry computer in computers.Children)
       {
           if ((computer.Name != "Schema"))
           {
               list.Add(computer.Name);
           }
       }

       foreach (string s in list)
       {
          int c = list.Count();
          return c;
       }       
4

4 に答える 4

2

おそらくreturn、メソッドにステートメントがありません。戻り型(この場合、コンピュータの数を返すのでおそらく整数型)が必要です。

public int ComputersOnNetwork()
{        
  List<string> list = new List<string>();
  using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
  {
       foreach (DirectoryEntry computer in computers.Children)
       {
          if ((computer.Name != "Schema"))
          {
             list.Add(computer.Name);
          }
       }
  }
  return list.Count;     
}

これで、このように好きな場所でこれを呼び出すことができます

int totalInThisCase=ComputersOnNetwork();
于 2012-05-22T23:26:22.547 に答える
1

戻り値の型が必要であり、リストに追加してからカウントを返すのではなく、カウント変数を使用する必要があります (また、なぜそのようにリストを反復処理したのでしょうか? その必要はありませんでした)。

常にコードを論理的に読み、アクションが論理的に正しく実行されているかどうかを確認してください。

public int ComputersOnNetwork()
{
    int count = 0;

    using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
    {
        foreach (DirectoryEntry computer in root.Children)
        {
            if ((computer.Name != "Schema"))
            {
                count++;
            }
        }

    return count;
}

または、LINQ を使用して短いバージョンを作成することもできます。

public int ComputersOnNetwork()
{
    using (var root = new DirectoryEntry("WinNT:"))
    {
        return root.Children.Cast<DirectoryEntry>().Count(x => x.Name != "Schema");
    }
}
于 2012-05-22T23:36:32.167 に答える
0

その最後のループは必要ありません。リストにすべてのコンピューターが含まれている場合は、次のようにする必要があります。

  public void ComputersOnNetwork()
  {
       List<string> list = new List<string>();
       using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
       {
           foreach (DirectoryEntry computer in computers.Children)
           {
               if ((computer.Name != "Schema"))
               {
                   list.Add(computer.Name);
               }
           }
       }

      return list.Count();
  } 

return ステートメントは、ヒットするとすぐに関数の実行を停止するため、最後の for ループは 1 回しか実行されません。

return ステートメントがなくてもc、 がループ内で宣言されていたため、問題が発生し、スコープ外になったため、後でコードで参照できませんでした。ループ内で変数を宣言する場合は注意が必要です。変数は反復ごとに再定義され、コードがコンパイルされる可能性がありますが、そのようなバグを追跡するのは難しい場合があります。

于 2012-05-22T23:34:08.497 に答える
0

最後に foreach ループは必要ありません。変数「s」を使用していないため、無駄な処理です。

必要なものを取得するには、void ではなく int を返すようにメソッドを変更し、最後に list.Count を返します。

public int ComputersOnNetwork()
{
   List<string> list = new List<string>();
   using (DirectoryEntry root = new DirectoryEntry("WinNT:"))
   {
       foreach (DirectoryEntry computer in computers.Children)
       {
           if ((computer.Name != "Schema"))
           {
               list.Add(computer.Name);
           }
       }

       int c = list.Count;
       return c;
   }
}

次に、値が必要なときはいつでもメソッドを呼び出します。

Int computerCount = ComputersOnNetwork();
于 2012-05-22T23:36:56.503 に答える