【问题标题】:Divide List in Equal Parts将列表分成相等的部分
【发布时间】:2011-07-19 22:24:51
【问题描述】:

我有一个很大的列表,其中可能有一些 50,000 或更多项目,我必须对每个项目进行操作。如果我使用常规方法并按顺序进行操作,现在需要一些 X 时间,这肯定需要X * 50,000 平均。

我计划优化并节省一些时间,并决定使用Background Worker,因为它们之间没有依赖关系。计划是将列表分成4部分,并在单独的Background Worker中使用。

我想问

1.这个方法是不是很蠢?

2.还有其他更好的方法吗?

3.建议一个漂亮而干净的方法将列表分成 4 个相等的部分?

谢谢

【问题讨论】:

    标签: c# algorithm performance list


    【解决方案1】:

    另一个版本,基于 linq。

    public static List<T[]> groups<T>(IList<T> original, uint n)
    {
            var almost_grouped = original.Select((row, i) => new { Item = row, GroupIndex = i / n });
            var groups = almost_grouped.GroupBy(a => a.GroupIndex, a => a.Item);
            var grouped = groups.Select(a => a.ToArray()).ToList();
            return grouped;
    }
    

    【讨论】:

      【解决方案2】:

      如果您可以使用 .Net 4.0,请使用 Task Parallel 库并查看

      Parallel.ForEach()
      

      Parallel ForEach How-to.

      一切都与传统的 for 循环基本相同,但您隐式使用并行性。

      【讨论】:

      • 4.0客户端版本支持吗?
      • 是的! .NET Framework Client Profile 支持。现在将其标记为答案! :D
      • 好的,兄弟,我一定会标记它需要等待 6 分钟才能做到这一点
      • 我写了代码,当列表中有 5 个项目时,并行 foreach 也会挂起一段时间,所以如果有大列表那么????其次,我应该只使用一个并行 foreach 或并行 foreach 而不是将列表划分为 4 个部分,而是替换 backgroundworker
      • @Afnan 您仍然希望使用后台工作程序来使循环脱离主线程,这样它就不会阻塞您的程序。但是,您不需要在内部生成多个(这是一个非常简化的模型) Parallel.ForEach 在内部为您生成后台工作人员。
      【解决方案3】:

      您也可以真正将其拆分为组。

      我没有看到它的内置序列方法,所以这里是低级方法。请指出任何错误。我正在学习。

      static List<T[]> groups<T>(IList<T> original, uint n)
          {
              Debug.Assert(n > 0);
              var listlist = new List<T[]>();
              var list = new List<T>();
      
              for (int i = 0; i < original.Count(); i++)
              {
                  var item = original[i];
                  list.Add(item);
                  if ((i+1) % n == 0 || i == original.Count() - 1)
                  {
                      listlist.Add(list.ToArray());
                      list.Clear();
                  }
      
              }
           return listlist;
          }
      

      【讨论】:

      • parallel.foreach 达到目的
      【解决方案4】:

      这是优化大型集合上类似的、独立的操作的好方法。但是,您应该查看 .NET 4.0 中的 Parallel.For 方法。它为您完成所有繁重的工作:

      http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多