需要更好的方法来总结数据
本文关键字:数据 方法 更好 | 更新日期: 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).;