【问题标题】:How to filter the list by using LINQ如何使用 LINQ 筛选列表
【发布时间】:2023-01-10 20:31:40
【问题描述】:

我有下面提到的列表。

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 } } } }
    }
};

我有两种方法

  1. “GetPublicNetworkUsedCount()”需要返回以“FFFF”开头的Value的计数 所以,在这种情况下,输出应该是 1。
  2. “GetPrivateNetworkUsedCount()”需要返回不以“FFFF”开头且包含空值的值的计数。 所以,在这种情况下,输出应该是 3。

    以下是我尝试过的:

    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();
    }
    

    我得到错误的输出,对于 GetPublicNetworkUsedCount 为 0,对于 GetPrivateNetworkUsedCount 为 1。

    请帮我。

【问题讨论】:

  • 你到底怎么称呼这两个?他们不接受您在第一本词典中拥有的 FeMeasurementValues。
  • 您能否将其更新为可以执行以演示问题的minimal reproducible example?我不清楚这两段代码是如何具体一起使用的。
  • 请注意,如果您的 FeMeasurementValue 具有多个 Fe​​Value,则代码中的两个条件并不相反。如果它有两个,一个以 FFFF 开头,一个不以 FFFF 开头,那么它可以通过这些实现既是公共的又是私有的。如果它没有 FeValues 则两者都不是。

标签: c# .net


【解决方案1】:

只要里面的条件为真,x.Value.Any()就会返回真。这导致 return 1 转换为数字。

获取以 FFFF 开头的所有条目,删除 Any 部分,例如:

var countofPublicNetwork = values.Where(x =>x.Value.StartsWith("FFFF"));

【讨论】:

    【解决方案2】:

    您有一个 List&lt;FeValue&gt;,其中每个对象都有一个字符串 Value。您将字符串视为一个集合并深入一步,不需要 .Any(

    所以检查应该只是

    values.Where(x => x.Value.StartsWith("FFFF")).Count();
    

    要不就

    values.Count(x => x.Value.StartsWith("FFFF"));
    

    【讨论】:

      【解决方案3】:

      查看 cmets:

      //             vv I'd recommend to return int
      private static string GetPublicNetworkUsedCount(List<FeValue> values)
      {                                                       // vv Any doesn't make sense here
          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();
      }
      

      所以,我会做这样的事情:

      private static int GetPublicNetworkUsedCount(List<FeValue> values) 
          => values.Count(x => x.Value.StartsWith("FFFF"));
      
      
      private static int GetPrivateNetworkUsedCount(List<FeValue> values)
          => values.Count(x => !x.Value.StartsWith("FFFF"));
      

      【讨论】:

        猜你喜欢
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多