You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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数量,预期结果为1
  • GetPrivateNetworkUsedCount():返回**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();
}

问题分析与修正方案

错误原因

  1. 参数范围错误:方法仅接收List<FeValue>,但实际需要遍历整个字典中的所有FeValue
  2. 逻辑错误:错误调用字符串的Any()方法(该方法用于检查字符是否存在),正确逻辑是直接判断字符串前缀
  3. 空值处理缺失:未覆盖私网统计中的空白值场景

修正后的代码

// 统计公网使用次数: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:05:21