22

我对 LINQ 和 PLINQ 还是很陌生。我通常只使用循环,并且List.BinarySearch在很多情况下,但我试图尽可能摆脱这种心态。

public class Staff
{
  // ...
  public bool Matches(string searchString)
  {
    // ...
  }
}

使用“普通”LINQ - 抱歉,我不熟悉术语 - 我可以执行以下操作:

var matchedStaff = from s
                     in allStaff
                  where s.Matches(searchString)
                 select s;

但我想并行执行此操作:

var matchedStaff = allStaff.AsParallel().Select(s => s.Matches(searchString));

当我检查 的类型时matchedStaff,它是一个bools 的列表,这不是我想要的。

首先,我在这里做错了什么,其次,我如何List<Staff>从这个查询中返回一个?

public List<Staff> Search(string searchString)
{
  return allStaff.AsParallel().Select(/* something */).AsEnumerable();
}

回报IEnumerable<type>,不是List<type>

4

2 回答 2

35

对于您的第一个问题,您应该替换SelectWhere

var matchedStaff = allStaff.AsParallel().Where(s => s.Matches(searchString));

Select是一个投影运算符,而不是过滤运算符,这就是为什么您要从输入序列到方法调用IEnumerable<bool>返回的布尔值的所有 Staff 对象的投影对应的原因。Matches

我知道您根本不使用它可能是反直觉的,因为您select似乎更熟悉“查询语法”,其中 select 关键字是强制性的,而使用“lambda 语法”(或“流利的语法”)并非如此。 ..无论命名如何),但就是这样;)

投影运算符,例如Select,将序列中的一个元素作为输入,并以某种方式将此元素转换/投影到另一种类型的元素(这里投影到bool类型)。而过滤运算符,例如Where,将序列中的一个元素作为输入,并根据谓词在输出序列中输出该元素,或者根本不输出该元素。

至于你的第二个问题AsEnumerable返回一个IEnumerable,因为它的名字表明;)如果你想得到一个List<Staff>你应该打电话ToList()(因为它的名字表明;)):

return allStaff.AsParallel().Select(/* something */).ToList();

希望这可以帮助。

于 2012-12-18T23:13:55.577 回答
10

无需放弃正常的 LINQ 语法即可实现并行性。您可以重写原始查询:

var matchedStaff = from s in allStaff
    where s.Matches(searchString)
    select s;

The parallel LINQ (“PLINQ”</a>) version would be:

var matchedStaff = from s in allStaff.AsParallel()
    where s.Matches(searchString)
    select s;

To understand where the bools are coming from, when you write the following:

var matchedStaff = allStaff.AsParallel().Select(s => s.Matches(searchString));

That is equivalent to the following query syntax:

var matchedStaff = from s in allStaff.AsParallel() select s.Matches(searchString);

As stated by darkey, if you want to use the C# syntax instead of the query syntax, you should use Where():

var matchedStaff = allStaff.AsParallel().Where(s => s.Matches(searchString));
于 2014-12-29T15:55:48.247 回答