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

时间:2013-07-18 12:53:31

标签: c# linq

我有这个课程

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的新手

3 个答案:

答案 0 :(得分:7)

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

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

SelectMany调用是将“列表数组”压缩为单个连接序列。

答案 1 :(得分:6)

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

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

当然,您是否从每个子集中选择每个项目然后对其进行计数(如 John Skeet 建议),或者您计算每个子集中的项目然后将计数加起来(如我的代码建议),结果将完全相同。

答案 2 :(得分:0)

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