Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net plinq选择所有函数计算为真的计数_.net_Plinq - Fatal编程技术网

.net plinq选择所有函数计算为真的计数

.net plinq选择所有函数计算为真的计数,.net,plinq,.net,Plinq,我有一套全双倍的数据: 100行20列 我正在将数据拉入IEnumerable列表,其中包含: var RowsOfData = File.ReadLines(dll.Globals.OutputDir + dll.Globals.filename).Select(a => a.Split(',').ToList()); var FilteredRowsToday = (from n in RowsOfData where n[1] == 1 orde

我有一套全双倍的数据: 100行20列

我正在将数据拉入IEnumerable列表,其中包含:

var RowsOfData = File.ReadLines(dll.Globals.OutputDir +     dll.Globals.filename).Select(a => a.Split(',').ToList());

var FilteredRowsToday = (from n in RowsOfData
       where n[1] == 1
       orderby n[0] descending
       select n);
然后我有一组函数,它们对每个数据行进行简单的检查,每个都返回一个Bool。 我想要的是计算每个函数为true的行数。 然后,当我扩大我的项目规模时,如果可能的话,我希望尽快并行处理该项目,我已经尝试:

foreach (var row in FilteredRowsToday) {  
is f1() true, is f2() true 
etc
}
似乎很慢 我也试着做同样的事情

foreach (var row in FilteredRowsToday.AsParallel())
不快

我现在想的是:

var TotalTrue = FilteredRowsToday.Select(item => f1() & f2() & f3()).Count();
我可以预处理数据,以提供每个函数的评估结果,作为一种二进制网格,如果这是一个更好的陈述点

F1, f2, f3 etc
1, 0, 0 row 1
1, 1, 1 row 2 etc

欢迎您的建议

如果您只对三个函数的计算结果都为true的计数感兴趣,那么这就足够了:

var TotalTrue = FilteredRowsToday.Count(item => f1() & f2() & f3());
至于它为什么慢,你的功能可能是背后的原因

您可以尝试只计算行,直到所有三个函数都返回true,或者至少其中一个函数返回false,例如

var TotalTrue = FilteredRowsToday.Count(item => f1() && f2() && f3());
也就是说,如果
f1()
的计算结果为
false
,则不必费心进行其余的验证


更新:如果您的函数没有执行任何资源密集型检查,那么并行LINQ对您没有多大好处(更多信息)。

如果您只对三个函数的计算结果都为真的计数感兴趣,那么这应该足够了:

var TotalTrue = FilteredRowsToday.Count(item => f1() & f2() & f3());
至于它为什么慢,你的功能可能是背后的原因

您可以尝试只计算行,直到所有三个函数都返回true,或者至少其中一个函数返回false,例如

var TotalTrue = FilteredRowsToday.Count(item => f1() && f2() && f3());
也就是说,如果
f1()
的计算结果为
false
,则不必费心进行其余的验证


更新:如果您的函数没有执行任何资源密集型检查,那么并行LINQ对您没有多大好处(更多信息)。

正如我看到的,您正在立即读取文件,它是一种逗号分隔的文件。 如果您在读取时从文件中产生记录,它将允许您处理这些记录,直到等待下一次读取

private IEnumerable<string> GetRecords(string fileName) {
    using (StreamReader reader = File.OpenText(fileName))
            {
                string line = reader.ReadLine();
                while (line != null)
                {   
                   yield return line.Split(',');
                   line = reader.ReadLine();
                 }
             }
}
private IEnumerable GetRecords(字符串文件名){
使用(StreamReader=File.OpenText(文件名))
{
字符串行=reader.ReadLine();
while(行!=null)
{   
收益率回归线.分割(',');
line=reader.ReadLine();
}
}
}
您还需要花费一些时间将
Split
的结果转换为
List
,该列表已经是
数组,并且具有执行查询所需的索引访问权限

我还建议应用之前建议的优化,比如使用
.Count(item=>f1()&f2()&f3())而不是
。选择(项=>f1()&f2()&f3()).Count()


尽管如此,我不相信这些优化会在如此少量的数据下带来任何改进。我认为,如果您发布一些关于您处理代码部分的详细信息,我们可以更好地帮助您。

因为我看到您正在立即读取文件,它是一种逗号分隔的文件。 如果您在读取时从文件中产生记录,它将允许您处理这些记录,直到等待下一次读取

private IEnumerable<string> GetRecords(string fileName) {
    using (StreamReader reader = File.OpenText(fileName))
            {
                string line = reader.ReadLine();
                while (line != null)
                {   
                   yield return line.Split(',');
                   line = reader.ReadLine();
                 }
             }
}
private IEnumerable GetRecords(字符串文件名){
使用(StreamReader=File.OpenText(文件名))
{
字符串行=reader.ReadLine();
while(行!=null)
{   
收益率回归线.分割(',');
line=reader.ReadLine();
}
}
}
您还需要花费一些时间将
Split
的结果转换为
List
,该列表已经是
数组,并且具有执行查询所需的索引访问权限

我还建议应用之前建议的优化,比如使用
.Count(item=>f1()&f2()&f3())而不是
。选择(项=>f1()&f2()&f3()).Count()


尽管如此,我不相信这些优化会在如此少量的数据下带来任何改进。我认为,如果您发布一些关于处理代码部分的详细信息,我们可以更好地帮助您。

100行是一个非常小的数目。你的计算为什么这么慢?有些方法需要很长时间吗?100行是一个很小的数目。你的计算为什么这么慢?有些方法需要很长时间吗?Tobias等人,非常感谢,我确实有一个列表来检查每个函数的返回,我是这样检查的:bool AllConditionsTrue=conditions.TrueForAll(o=>o);这很好,但我也喜欢你上面的。关于每个函数计算的相对费用:早期,有些函数非常简单,有些函数更复杂,这就是为什么我可以先对函数进行预处理,然后将二进制网格类型结构的结果作为一个单独的过程进行计数。@user1796185:如果大部分处理时间都花在预处理上,那么预处理不会加快处理速度。计算结果不是问题。我的建议是关注您的评估方法,看看您可以在哪里优化它们。您甚至可以在检查结果时按复杂性顺序对其进行评估,从而确保先运行便宜(快速)的方法,如果其他方法的评估结果为
true
,则只运行更密集的方法。Tobias等人,非常感谢,我确实有一个列表来检查以这种方式检查的每个函数的返回:bool AllConditionsTrue=conditions.TrueForAll(o=>o);这很好,但我也喜欢你上面的。至于每个函数计算的相对费用:早期,有些函数非常简单,而另一些更复杂,这就是为什么我可以先对函数进行预处理,然后将二进制网格类型结构的结果计算为