需要更好的方法来总结数据

本文关键字:数据 方法 更好 | 更新日期: 2023-09-27 18:23:42

我有这个类

public class ConnectionResult
{
  private int connectionPercentage;
  public int ConnectPercentage
  {
     get { return connectionPercentage; }
  }
  public ConnectionResult(int ip)
  {
     // Check connection and set connectionPercentage
  }
}

我有一个管理器,它获取ConnectionResult的几个列表,并计算每个大于配置确定的特定数字的值。我的实现是这样的:

public class CurrentConnections
{
  private static CurrentConnections inst;
  private CurrentConnections()
  {
  }
  public static CurrentConnections GetInstance
  {
     get
     {
        if (inst != null)
        {
           inst = new CurrentConnections();
        }
        return inst;
     }
  }
   public int CountActiveConnections(params List<ConnectionResult>[] conns)
   {
     int rtVal = 0;
     foreach (List<ConnectionResult> connectionResult in conns)
     {
        foreach (var currConn in connectionResult)
        {
           if (currConn.ConnectPercentage > ACCEPTABLE_CONNECTION)
           {
              rtVal++;
           }
        }
     }
     return rtVal;
  }
}

但我想让它变得更好,所以我开始用linq写它,我得到了

conns.Count(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION));

但这给了我一个CCD_ 1的错误。有没有办法在linq中计算它,或者我必须坚持我写的东西?顺便说一句,我是linq 的新手

需要更好的方法来总结数据

您正在使用Count两次,我认为您不想。我认为您只想:

return conns.SelectMany(list => list)
            .Count(conn => conn.ConnectPercentage > ACCEPTABLE_CONNECTION);

SelectMany调用是将"列表数组"扁平化为单个连接序列。

John Skeet的答案很好,但为了解决您看到的错误,查询将是:

conns.Sum(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION));
  • Count接受一个函数,该函数返回bool并返回集合中满足该条件的项目数
  • Sum接受返回int(以及其他)的函数,并返回应用于每个项目的表达式的结果之和

当然,无论你是从每个子集中选择每个项目,然后将它们加起来(就像John Skeet建议的那样),还是对每个子集中的项目进行计数,然后将计数加起来(像我的代码建议的一样),结果都会完全相同。

return conns.SelectMany(x=> x).Where(conn => conn.ConnectPercentage > ACCEPTABLE_CONNECTION).;