7

我有这门课

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

但这给了我一个错误Cannot implicitly convert type 'int' to 'bool'。有没有办法在 linq 中计算它,还是我必须坚持我写的内容?顺便说一句,我是 linq 的新手

4

3 回答 3

7

您使用Count了两次,我认为您不想这样做。我想你只是想要:

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

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

于 2013-07-18T12:55:24.737 回答
6

John Skeet的回答非常好,但要解决您看到的错误,查询将是:

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

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

于 2013-07-18T12:59:43.697 回答
0
return conns.SelectMany(x=> x).Where(conn => conn.ConnectPercentage > ACCEPTABLE_CONNECTION).;
于 2013-08-30T18:19:33.107 回答