2012-02-22 4 views
0

Привет, я новичок в программировании и не вижу, что не так с этим кодом У меня есть текстовое поле, в которое я добавлю имя хоста, а затем строка S1 будет добавлена, а затем пингует все i хочу код, чтобы сделать, это список того, что является правильным именем хоста, так что если я введите имя компьютера в текстовом поле будет свистеть следующийPing host, чтобы определить имя хоста

ComputerDT 
ComputerLT 
computerTB 
computerR0 

только один будет иметь правильное имя хоста и я хочу перечислить это в перечне по одному его всем рабочим штрафом, кроме последнего, если заявление

if (host1 != "") 
    listBox1.Items.Add(host1); 

и я получаю host1 не в местном контексте я не могу понять, почему это неправильно

кто может помочь, пожалуйста,

public partial class Form1 : Form 
    { 
     public string S1 = "DT"; 
     public string S2 = "LT"; 
     public string S3 = "R0"; 
     public string S4 = "TB"; 

    public Form1() 
    { 
     InitializeComponent(); 



    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     update(); 
    } 



    static string Ping(string host) 
    { 
     Ping pingSender = new Ping(); 
     PingOptions options = new PingOptions(); 
     string errMessage = string.Empty; 
     string returnMessage; 


     // Use the default Ttl value which is 128, 
     // but change the fragmentation behavior. 
     options.DontFragment = true; 

     // Create a buffer of 32 bytes of data to be transmitted. 
     string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
     byte[] buffer = Encoding.ASCII.GetBytes(data); 
     int timeout = 120; 
     try 
     { 
      PingReply reply = pingSender.Send(host, timeout, buffer, options); 

      if (!(reply == null)) 
      { 
       switch (reply.Status) 
       { 
        case IPStatus.Success: 
         returnMessage = string.Format("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); 
         break; 
        case IPStatus.TimedOut: 
         returnMessage = "Connection has timed out..."; 
         break; 
        default: 
         returnMessage = string.Format("Ping failed: {0}", reply.Status.ToString()); 
         break; 
       } 
      } 
      else 
       returnMessage = "Connection failed for an unknown reason..."; 
     } 
     catch (PingException ex) 
     { 
      returnMessage = string.Format(""); 
     } 
     catch (SocketException ex) 
     { 
      returnMessage = string.Format(""); 
     } 


     return returnMessage; 






    } 



    public void update() 
    { 


     string[] lines = textBox1.Lines; 
     List<string> myCollection = new List<string>(); 

     string host1; 


     foreach (string line in lines) 
     { 
      if (line.Contains("")) 

       myCollection.Add(line + S1); 
      myCollection.Add(line + S2); 
      myCollection.Add(line + S3); 
      myCollection.Add(line + S4); 
     } 

     myCollection.ToArray(); 



     { 
      foreach (string val in myCollection) 

       host1 = Ping(val); 

      if (host1 != "") 

       listBox1.Items.Add(host1); 


     } 
    } 
} 
} 

ответ

0

Вам нужно обернуть foreach петлю в фигурных скобках:

foreach (string val in myCollection) 
{ 
    host1 = Ping(val); 
    if (host1 != "") 
     listBox1.Items.Add(host1); 
} 

в противном случае будет только зацикливать первую строку. (Который почему host1 больше не находится в области видимости)

, если заявление над ней выглядит сомнительный {хихиканье}, а также:

if (line.Contains("")) 

    myCollection.Add(line + S1); 
myCollection.Add(line + S2); 
myCollection.Add(line + S3); 
myCollection.Add(line + S4); 

должно быть

if (line.Contains("")) // this will always be true. Need to use a proper check here 
{ 
    myCollection.Add(line + S1); 
    myCollection.Add(line + S2); 
    myCollection.Add(line + S3); 
    myCollection.Add(line + S4); 
} 
+0

спасибо, что не верю, что я посмотрел, что – user1221996

+0

Хотя скобки - хорошая идея, на самом деле это не решает проблему, потому что host1 объявляется за пределами области foreach? – McKay

+0

Да, это будет потому, что 'host1' не _initialized_ вне цикла' foreach' –

1

избежать, используя следующие конструкции

if(condition) 
    expression; 

foreach(condition) 
    expression; 

вместо этого всегда использовать брекеты - тогда вы обнаружите проблему

+0

OP выглядит как программист на Python (или аналогичный). - ** C# не интересует пробел! Это все о '{' '}'! ** – qJake

Смежные вопросы