C# WPF中计算PingReply数组RoundTripTime平均值及单向时延
计算单向传输时延的实现方案
嘿,我来帮你把这个单向时延的计算逻辑补全!首先得提醒你一个关键点:不是所有的PingReply都是成功的,如果直接用所有数组元素的RoundTripTime,遇到超时或者错误的回复会导致结果不准,所以第一步要先过滤出成功的回复。
下面给你两种实现方式,你可以根据自己的习惯选:
方式一:传统循环(和你现有代码风格一致)
// 统计成功回复的数量和往返时间总和 int successfulReplyCount = 0; long totalRoundTripTime = 0; foreach (PingReply r in arrayReply) { // 只处理成功的Ping回复 if (r.Status == IPStatus.Success) { successfulReplyCount++; totalRoundTripTime += r.RoundTripTime; } } // 计算单向时延:先求平均往返时间,再除以2 // 注意用double转换避免整数除法丢失精度 double oneWayDelay = successfulReplyCount > 0 ? (double)totalRoundTripTime / successfulReplyCount / 2 : 0;
方式二:LINQ简洁实现
如果项目里允许用LINQ,代码会更简洁直观:
// 过滤成功回复,提取往返时间,计算平均值后除以2 var successfulRoundTripTimes = arrayReply .Where(r => r.Status == IPStatus.Success) .Select(r => r.RoundTripTime); double oneWayDelay = successfulRoundTripTimes.Any() ? successfulRoundTripTimes.Average() / 2 : 0;
关键说明
- 一定要判断
r.Status == IPStatus.Success:如果Ping超时或者失败,RoundTripTime的值可能是0或者无意义的数值,会拉低整体平均值,导致计算结果错误。 - 用
double类型计算:因为RoundTripTime是long类型,直接整数除法会丢失小数部分,转换成double能得到更精确的单向时延结果。 - 处理无成功回复的情况:如果所有Ping都失败了,要避免除以0的错误,所以设置默认值0(或者你可以根据需求改成抛出提示、返回null等)。
内容的提问来源于stack exchange,提问作者T M
相关产品推荐
相关产品推荐

