を使用Interlocked.Increment
して ID を生成することも、インデックスを直接使用することもできます。
List<FileInfo> files = GetFilesToProcess();
files.AsParallel().Select((f, i) => new {File=f, ID=i})
.ForAll(fp =>
{
FileInfo file = fp.File;
int id = fp.ID; // ID is the index in the list
// Process file here
});
を使用したい場合はInterlocked.Increment
、次のようにします。
List<FileInfo> files = GetFilesToProcess();
int globalId = -1;
files.AsParallel().ForAll(f =>
{
// Process file here
int id = Interlocked.Increment(ref globalId);
// use ID
});
そうは言っても、コレクションで「作業」を行うことが全体の目標である場合は、代わりにこれを Parallel.For または Parallel.ForEach として記述することをお勧めします。これは、副作用を生成するためだけに LINQ スタイルの構文を使用していないため、より明確です。
List<FileInfo> files = GetFilesToProcess();
Parallel.For(0, files.Count, i =>
{
var file = files[i];
// Use i and file as needed
});