【问题标题】:Parallel.For loops the same itemsParallel.For 循环相同的项目
【发布时间】:2012-01-25 15:56:07
【问题描述】:

我有这个 Parallel.For 代码:

foreach (string g in allGames)
{
    eventsList.Add(game);
}

eventsList.Distinct();

Parallel.For(0, eventsList.Count, i =>
                {
                    Console.WriteLine(eventsList[i]);
                });

allGames 数组包含以下字符串:

String A: Lee, Stephen - Cope, Jamie
String B: Carter, Ali - Stevens, M
String C: Dott, G - McManus, Alan
String D: Bingham, S - Liu Song
String E: Davis, Mark - Joyce, Mark
String F: Walden, R - Liu Chuang

我的结果如下:

Game: Lee, Stephen - Cope, Jamie
Game: Lee, Stephen - Cope, Jamie
Game: Lee, Stephen - Cope, Jamie
Game: Lee, Stephen - Cope, Jamie
Game: Carter, Ali - Stevens, M
Game: Dott, G - McManus, Alan
Game: Bingham, S - Liu Song
Game: Davis, Mark - Joyce, Mark
Game: Walden, R - Liu Chuang

似乎它进行了 4 次相同的迭代(它在代码中发生了很多次)。

我确认 eventsList 列表不包含任何重复项,这是 100% 确认的。

有什么线索可以解决这个问题,让它在每个元素上只工作一次吗?

谢谢!

【问题讨论】:

  • eventsList.Distinct(); 这一行没有多大作用。你是说eventsList = eventsList.Distinct(); 吗?
  • 在执行.Distinct() 时将返回一个新对象,而不是更改列表。此外,您似乎将game 对象添加到列表allGames.Count() 次(您的局部变量称为g,而不是game)。

标签: c# loops for-loop


【解决方案1】:

这可能是问题所在 - 或者至少是您的代码中的错误:

eventsList.Distinct();

这不会做任何事情 - 与所有其他 LINQ 运算符一样,它返回一个新序列,而不是修改现有序列。试试:

eventsList = eventsList.Distinct().ToList();

我知道您您 100% 确定该列表不包含任何重复项 - 但在这种情况下,您不需要 distinct 调用,对吗?不管怎样,这都是一行无用的代码。

您提供的Parallel.For 代码很好,尽管使用Parallel.ForEach 会更整洁:

Parallel.ForEach(eventsList, Console.WriteLine);

如果仍然失败,请发布一个简短但完整的程序来演示问题。

【讨论】:

  • 嗨,谢谢,我解决了这个问题,但出现了同样的错误!正如我所说,我确认了列表(仅使用调试器)
  • @HarisHasan:如果每次 OP 声称他们 100% 确定问题 不是 在 X 中,我都有一美元,但结果却是正好是 X...
  • @IdoLazar:是的,你认为你已经确认了——但我不喜欢排除任何可能性,因为我经常看到人们认为他们已经确认了一些东西,但他们没有。正如我在答案中所说,一个简短但完整的程序演示这个问题真的会在这里帮助......
  • @HarisHasan - 乔恩是对的。你改正了吗?除非您可以在其他地方保证数据始终是不同的,否则您可能需要它。
  • @IdoLazar:正如我所说,一个简短但完整的程序来演示这个问题真的很有帮助......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多