2015-10-19 5 views
1

Мой код работает нормально, но там, где он сохраняет результаты в CSV-файле, мне нужно внести несколько изменений. Мои результаты:Распечатайте все 4 пинга в строковой строке, разделенных запятой

www.yahoo.com , 98.139.183.24 , 137 
www.att.com , 23.72.249.145 , 20 
www.yahoo.com , 98.139.183.24 , 120 
www.att.com , 23.72.249.145 , 16 

, и я хочу, чтобы мой результат будет:

www.yahoo.com , 137 , 120 
www.att.com , 20 , 16 

В этом примере я поделился только два результата, я на самом деле возвращающимся 4 результатов и мне нужно поставить их все в одной строке, и мне также нужно избавиться от IP-адреса. Пожалуйста, помогите мне.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net.NetworkInformation; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> lstWebSites = new List<string>(); 
      lstWebSites.Add("www.yahoo.com"); 
      lstWebSites.Add("www.att.com"); 
      lstWebSites.Add("www.verizon.com"); 
      string filename = @"PingLog.csv"; 
      { 
       using (var writer = new StreamWriter(filename, true)) 
       { 
        for (int i = 0; i < 4; i++) 
        foreach(string website in lstWebSites) 
        { 
         //writer.WriteLine(website, lstWebSites); 
         try 
         { 
          Ping myPing = new Ping(); 
          PingReply reply = myPing.Send(website, 1000); 
          if (reply != null) 
          { 
           writer.WriteLine(website + " , " + reply.Address.ToString() + " , " + reply.RoundtripTime); 
          } 
         }     
         catch 
         { 
          Console.WriteLine("ERROR: You have some TIMEOUT issue"); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Лучше использовать словарь >() – Steve

+0

Я не понимаю, что вы имеете в виду? – NewDev

ответ

0

Если вы хотите, чтобы показать все результаты вашего Ping звонков затем, вместо того, чтобы просто List<string> сохранить имена сайтов, вы можете использовать Dictionary<string, List<PingReply>>. Таким образом, для каждого пинг в сторону определенного сайта вы сохранить список всех PingReply получил и в конце цикла вы все писать в файл (с небольшой помощью Linq)

static void Main(string[] args) 
{ 
    // Dictionary to keep the sites list and the list of replies for each site 
    Dictionary<string, List<PingReply>> lstWebSites = new Dictionary<string, List<PingReply>>(); 
    lstWebSites.Add("www.yahoo.com", new List<PingReply>()); 
    lstWebSites.Add("www.att.com", new List<PingReply>()); 
    lstWebSites.Add("www.verizon.com", new List<PingReply>()); 
    string filename = @"d:\temp\PingLog.csv"; 

    // Start your loops 
    for (int i = 0; i < 4; i++) 
     foreach (string website in lstWebSites.Keys) 
     { 
      try 
      { 
       Ping myPing = new Ping(); 
       PingReply reply = myPing.Send(website, 1000); 
       if (reply != null) 
       { 
        // Do not write to file here, just add the 
        // the reply to your dictionary using the site key 
        lstWebSites[website].Add(reply); 
       } 
      } 
      catch 
      { 
       Console.WriteLine("ERROR: You have some TIMEOUT issue"); 
      } 
     } 


    using (var writer = new StreamWriter(filename, false)) 
    { 
     // For each site, extract the RoundtripTime and 
     // use string.Join to create a comma separated line to write 
     foreach(string website in lstWebSites.Keys) 
      writer.WriteLine(website + " , " + 
       string.Join(",", lstWebSites[website] 
         .Select(x => x.RoundtripTime) 
         .ToArray())); 
    } 

    string fileText = File.ReadAllText(filename); 
    Console.WriteLine(fileText); 

} 
+0

ничего себе, я просто сделал все изменения и его точно, как я этого хотел. Огромное спасибо. Это была действительно большая помощь и ее совершенство. – NewDev

0

Самый простой путь - перемещаться для цикла внутри цикла foreach и собирать результаты ping для каждого сайта. Вы можете изменить свой код к следующему:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Net.NetworkInformation; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var lstWebSites = new List<string> 
      { 
       "www.yahoo.com", 
       "www.att.com", 
       "www.verizon.com" 
      }; 

      var filename = @"PingLog.csv"; 
      { 
       using (var writer = new StreamWriter(filename, true)) 
       { 
        foreach (var website in lstWebSites) 
        { 
         var roundTripTimes = new List<long>(); 

         for (var i = 0; i < 4; i++) 
         { 
          try 
          { 
           var myPing = new Ping(); 
           var reply = myPing.Send(website, 1000); 

           if (reply != null) 
           { 
            roundTripTimes.Add(reply.RoundtripTime); 
           } 
          } 
          catch 
          { 
           Console.WriteLine("ERROR: You have some TIMEOUT issue"); 
          } 
         } 

         writer.WriteLine("{0} , {1}", website, string.Join(" , ", roundTripTimes)); 
        } 
       } 
      } 
      Console.ReadKey(); 
     } 
    } 
} 

Но это лучше, чтобы узнать некоторые LINQ (например LINQ 101) и писать код в менее многословной манере, как это:

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.IO; 
using System.Net.NetworkInformation; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var lstWebSites = new List<string> 
      { 
       "www.yahoo.com", 
       "www.att.com", 
       "www.verizon.com" 
      }; 

      var filename = @"PingLog.csv"; 

      var pings = Enumerable.Range(0, 4).SelectMany(_ => lstWebSites.Select(ws => new {Ping = new Ping(), WebSite = ws})); 
      var result = pings.Select(_ => new {Reply = _.Ping.Send(_.WebSite, 1000), _.WebSite}).ToLookup(_ => _.WebSite, p => p.Reply.RoundtripTime); 

      using (var writer = new StreamWriter(filename, true)) 
      { 
       foreach (var res in result) 
       { 
        writer.WriteLine("{0}, {1}", res.Key, string.Join(" , ", res)); 
       } 
      } 

      Console.ReadKey(); 
     } 
    } 
} 

В этом примере не хватает обработки исключений но вы можете понять основную идею.

+0

Я дам это попробовать также ... спасибо – NewDev

+0

Я получаю красную строку под RoundtripTime, где у меня есть if (result! = Null) roundTripTimes.Add (result.RoundtripTime); – NewDev

+0

Какое сообщение вы видите во всплывающей подсказке, когда указываете мышь на этой строке? –