2012-05-09 24 views
2

これは、人気のRuneScapeゲームの各サーバーをテストするアプリケーションです。私は139台のサーバーのそれぞれでpingを実行しており、配列に遅延値を追加しています。リストエントリをループしている間に、各サーバの平均、最小、最大のラグを計算できます。最小/最大/平均ping応答の計算

私のコードでは到達不能なサーバーの1つが記録されている場合、最低遅延は0と表示されます。私のping応答がタイムアウトに達していて、配列リストに0を投稿した場合の対処方法がわかりません。

サーバーがダウンしているときに私の最低のpingとして0を避けるにはどうすればよいですか?

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

namespace RuneScape_Ping_Tool 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write(Environment.NewLine + "Start the test? (y/n): "); 

      if (Console.Read() == char.Parse("y")) 
      { 
       Console.WriteLine(); 
       Ping(); 
      } 
     } 

     static void Ping() 
     { 
      List<int> lag = new List<int>(); 

      for (int server = 1; server <= 139; server++) 
      { 
       string url = "world" + server.ToString() + ".runescape.com"; 

       Console.WriteLine("Checking world " + server + "..."); 

       Ping ping = new Ping(); 
       PingReply reply = ping.Send(url); 

       lag.Add(int.Parse(reply.RoundtripTime.ToString())); 
      } 

      for (int i = 1; i <= 139; i++) 
      { 
       Console.WriteLine("World " + i + ": " + lag[i - 1]); 
      } 

      int average = 0; 
      int highest = 1; 
      int lowest = 1000; 

      int highestWorld = 0; 
      int lowestWorld = 0; 

      for (int i = 1; i <= 139; i++) 
      { 
       average = average + lag[i - 1]; 
      } 

      for (int i = 1; i <= 139; i++) 
      { 
       if (highest < lag[i - 1]) 
       { 
        highest = lag[i - 1]; 
        highestWorld = i; 
       } 
      } 

      for (int i = 1; i <= 139; i++) 
      { 
       if (lowest > lag[i - 1]) 
       { 
        lowest = lag[i - 1]; 
        lowestWorld = i; 
       } 
      } 

      Console.WriteLine(); 
      Console.WriteLine("Average lag: " + average/139); 
      Console.WriteLine("Highest lag: " + highest + " in world " + highestWorld); 
      Console.WriteLine("Lowest lag: " + lowest + " in world " + lowestWorld); 

      Console.Write(Environment.NewLine + "Start the test? (y/n): "); 

      if (Console.Read() == char.Parse("y")) 
      { 
       Console.WriteLine(); 
       Ping(); 
      } 
     } 
    } 
} 

答えて

2

ゼロをスキップできますか?また、すべての計算を1つのループ内に置くこともできます。

int n = 0 // number of data points 

for (int i = 0; i < 139; ++i) { 
    if (lag[i] == 0) { 
    continue; // skip 0 values 
    } 
    ++n; 
    sum += lag[i]; 

    if (highest < lag[i]) { 
    highest = lag[i]; 
    highestWorld = i + 1; 
    } 

    if (lowest > lag[i]) { 
    lowest = lag[i]; 
    lowestWorld = i + 1; 
    } 

    average = sum/n; // Note: you may want to round this. 
} 
+0

本当に返された 'PingResult.Status'の値を確認したいのですが? 0をチェックすることはハックのようです。 – yamen

+0

私は3の代わりに1つのループを使うべきです。ありがとう。 – HelpNeeder

+0

@yamen:いいですね。私は論理を説明したかったが、私はC#を話さない。助けてくれてありがとう! –

1

これらの機能では、最小、最大、平均を得ることができます。

まず(ここでは一度に4)を並列にすべてを実行することを検討
var nozeros = lag.Where(i => i > 0); 
int lowest = nozeros.Min(); 
int lowestWorld = lag.IndexOf(lowest); 
int highest = nozeros.Max(); 
int highestWorld = lag.IndexOf(highest); 
int average = (int)nozeros.Average(); 
+0

あなたは 'i => i> 0'を意味すると思います。 –

+1

はい、ありがとうございます。 –

+0

'... generic.list <>'の中に 'lag.Where'の定義が含まれていないというエラーが表示されたようです。私は追加の参照が必要ですか? – HelpNeeder

1

var servers = Enumerable.Range(1, 139).Select(i => String.Format("world{0}.runescape.com",i)); 
var results = servers.AsParallel() 
        .WithDegreeOfParallelism(4) 
        .Select(server => new Ping().Send(server)) 
        .ToList(); 

それからちょうど有効な結果、ノートPingReply.Statusを使用してではなく、0のチェックを収集:

var validResults = results.Where(r => r.Status == IPStatus.Success) 
          .Select(r => r.RoundtripTime); 

必要な情報は次のとおりです。

Console.WriteLine("Total Results: {0}", results.Count()); 
Console.WriteLine("Valid Results: {0}", validResults.Count()); 
Console.WriteLine("Min from Valid: {0}", validResults.Min()); 
Console.WriteLine("Max from Valid: {0}", validResults.Max()); 
Console.WriteLine("Avg from Valid: {0}", validResults.Average()); 
関連する問題