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

No *_*ame 7 c# linq

我有这堂课

public class ConnectionResult
{
  private int connectionPercentage;

  public int ConnectPercentage
  {
     get { return connectionPercentage; }
  }

  public ConnectionResult(int ip)
  {
     // Check connection and set connectionPercentage
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个管理器,它获取几个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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我想让它变得更好,所以我开始在linq中写它并且我得到了

conns.Count(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION));
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

你使用了Count两次,我认为你不想.我想你只想要:

return conns.SelectMany(list => list)
            .Count(conn => conn.ConnectPercentage > ACCEPTABLE_CONNECTION);
Run Code Online (Sandbox Code Playgroud)

SelectMany呼叫是到"的列表阵列"变平成连接的单个序列.


p.s*_*w.g 6

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

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

当然,无论你是从每个子集中选择每个项目然后对它们进行计数(如John Skeet建议的那样),或者你计算每个子集中的项目然后将计数加起来(就像我的代码建议的那样),结果就是相同.