我是 LINQ 和 PLINQ 的新手,我正在构建一个项目来测试它们。
存根:
class Stub
{
private Boolean mytf;
public Stub()
{
Random generator = new Random();
if (generator.NextDouble() < 0.5)
{
mytf = false;
}
else mytf = true;
}
public Boolean tf
{
get
{
return mytf;
}
}
}
存根集合:
class StubCollection : IEnumerable
{
Stub[] stubs;
public StubCollection(int n)
{
stubs = new Stub[n];
for (int i = 0; i < n; i++)
{
stubs[i] = new Stub();
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return new StubIterator(this);
}
public class StubIterator : IEnumerator
{
private StubCollection sc;
private int index = -1;
public StubIterator(StubCollection _sc)
{
sc = _sc;
}
public bool MoveNext()
{
index++;
if (index < sc.stubs.Length)
{
return true;
}
else
{
index = -1;
return false;
}
}
public object Current
{
get
{
if (index <= -1)
{
throw new InvalidOperationException();
}
return sc.stubs[index];
}
}
public void Reset()
{
index = -1;
}
}
}
然后我有一些方法来迭代存根集合并计算有多少存根将布尔值设置为真:
前锋:
Stopwatch sw = new Stopwatch();
Int32 n = 0;
sw.Start();
foreach (Stub s in sc)
if (s.tf) n++;
sw.Stop();
MessageBox.Show("n:" + n.ToString() + " timer:" + sw.ElapsedMilliseconds.ToString());
有用
林克:
Stopwatch sw = new Stopwatch();
Int32 n = 0;
sw.Start();
var trueStubs = from Stub s in sc
where s.tf
select s;
n = trueStubs.Count();
sw.Stop();
MessageBox.Show("n:" + n.ToString() + " timer:" + sw.ElapsedMilliseconds.ToString());
它有效(比 foreach 慢一点)
普林克:
Stopwatch sw = new Stopwatch();
Int32 n = 0;
sw.Start();
var trueStubs = from Stub s in sc.AsParallel()
where s.tf
select s;
n = trueStubs.Count();
sw.Stop();
MessageBox.Show("n:" + n.ToString() + " timer:" + sw.ElapsedMilliseconds.ToString());
100% CPU,没有结果
为什么?唯一的区别是 AsParallel()