如何使用LINQ过滤字典数据并修正统计方法错误?
问题修正:统计FeValue的公网/私网使用次数
测试数据
现有Dictionary<Gateway, List<FeMeasurementValues>>类型的测试数据如下:
var fakedata = new Dictionary<Gateway, List<FeMeasurementValues>>() { { new Gateway { SiteId = 1, FirmwareVersion = "1.1.1", ConnectivityStatus = GatewayConnectivityStatus.ReadyToConnect }, new List<FeMeasurementValues>() { new FeMeasurementValues { MeasurementName = "MsgLRRID", Values = new List<FeValue> { new FeValue { Value = "FFFF123", Horodate = DateTime.Now } } } } }, { new Gateway { SiteId = 2, FirmwareVersion = "1.1.2", ConnectivityStatus = GatewayConnectivityStatus.Connected }, new List<FeMeasurementValues>() { new FeMeasurementValues { MeasurementName = "MsgLRRID", Values = new List<FeValue> { new FeValue { Value = "GH67123", Horodate = DateTime.Now } } } } }, { new Gateway { SiteId = 3, FirmwareVersion = "1.1.3", ConnectivityStatus = GatewayConnectivityStatus.Disconnected }, new List<FeMeasurementValues>() { new FeMeasurementValues { MeasurementName = "MsgLRRID", Values = new List<FeValue> { new FeValue { Value = " ", Horodate = DateTime.Now } } } } }, { new Gateway { SiteId = 4, FirmwareVersion = "1.1.1", ConnectivityStatus = GatewayConnectivityStatus.Connected }, new List<FeMeasurementValues>() { new FeMeasurementValues { MeasurementName = "MsgLRRID", Values = new List<FeValue> { new FeValue { Value = "SA67123", Horodate = DateTime.Now } } } } } };
需求说明
需要实现两个统计方法:
GetPublicNetworkUsedCount():返回Value以"FFFF"开头的FeValue数量,预期结果为1GetPrivateNetworkUsedCount():返回**Value不以"FFFF"开头(包含空值/空白值)**的FeValue数量,预期结果为3
错误实现代码
以下是尝试的实现,但运行结果错误:GetPublicNetworkUsedCount返回0,GetPrivateNetworkUsedCount返回1
private static string GetPublicNetworkUsedCount(List<FeValue> values) { var countofPublicNetwork = values.Where(x => x.Value.Any(f => x.Value.StartsWith("FFFF"))); return countofPublicNetwork.Count().ToString(); } private static string GetPrivateNetworkUsedCount(List<FeValue> values) { var countofPrivateNetwork = values.Where(x => x.Value.Any(f => !x.Value.StartsWith("FFFF"))); return countofPrivateNetwork.Count().ToString(); }
问题分析与修正方案
错误原因
- 参数范围错误:方法仅接收
List<FeValue>,但实际需要遍历整个字典中的所有FeValue - 逻辑错误:错误调用字符串的
Any()方法(该方法用于检查字符是否存在),正确逻辑是直接判断字符串前缀 - 空值处理缺失:未覆盖私网统计中的空白值场景
修正后的代码
// 统计公网使用次数:Value以"FFFF"开头的FeValue数量 private static int GetPublicNetworkUsedCount(Dictionary<Gateway, List<FeMeasurementValues>> fakeData) { // 逐层提取所有FeValue,再统计符合条件的数量 return fakeData.Values .SelectMany(measurementList => measurementList) .SelectMany(measurement => measurement.Values) .Count(feValue => !string.IsNullOrEmpty(feValue.Value) && feValue.Value.StartsWith("FFFF")); } // 统计私网使用次数:Value不以"FFFF"开头(含空/空白值)的FeValue数量 private static int GetPrivateNetworkUsedCount(Dictionary<Gateway, List<FeMeasurementValues>> fakeData) { return fakeData.Values .SelectMany(measurementList => measurementList) .SelectMany(measurement => measurement.Values) .Count(feValue => string.IsNullOrEmpty(feValue.Value?.Trim()) || !feValue.Value.StartsWith("FFFF")); }
关键修正点
- 调整方法参数为完整的测试字典,确保能遍历所有
FeValue - 移除错误的
Any()调用,直接使用StartsWith("FFFF")判断前缀 - 增加空值/空白值判断:用
string.IsNullOrEmpty(feValue.Value?.Trim())覆盖空白值场景 - 返回类型改为
int(更符合统计次数的语义,若需字符串可自行转换)
测试调用示例
var publicCount = GetPublicNetworkUsedCount(fakedata); // 输出1 var privateCount = GetPrivateNetworkUsedCount(fakedata); // 输出3 Console.WriteLine($"公网使用次数:{publicCount},私网使用次数:{privateCount}");
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

