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、それは s のリストでありbool、これは私が望むものではありません。

まず第一に、ここで何が間違っているのか、第二に、List<Staff>このクエリから a を返すにはどうすればよいですか?

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は射影 operatorであり、フィルタリングではありません。そのためIEnumerable<bool>、入力シーケンスからMatchesメソッド呼び出しによって返されるブール値へのすべての Staff オブジェクトの射影に対応する を取得しています。

select「ラムダ構文」(または「流暢な構文」を使用する場合とは異なり、選択キーワードが必須である「クエリ構文」に慣れているように見えるため、まったく使用しないことは直感に反する可能性があることを理解しています. .. ネーミングが何であれ)、しかしそれがその方法です;)

などの射影演算子はSelect、シーケンスから要素を入力として取り、この要素を何らかの方法で別のタイプの要素に変換/射影します (ここではbool型に射影します)。一方、 などのフィルタリング演算子はWhere、シーケンスから要素を入力として取り、述語に基づいて要素をそのまま出力シーケンスに出力するか、要素をまったく出力しません。

2番目の質問については、その名前が示すようにをAsEnumerable返します;)を取得したい場合は、むしろ電話する必要があります(名前が示すように;)):IEnumerableList<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;

並列 LINQ ( “PLINQ”</a>) のバージョンは次のようになります。

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

s がどこから来ているかを理解するにはbool、次のように記述します。

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

これは、次のクエリ構文と同等です。

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

darkey が述べたように、クエリ構文の代わりに C# 構文を使用する場合は、次を使用する必要がありますWhere()

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