-2

有一个 List,SomeObject 有属性 TargetObject。我需要创建一个列表,其中 SomeObjects 具有以下 TargetObject。

SO_1 (TO_1) | SO_2 (TO_2) | SO_3 (TO_3) | SO_4 (TO_1) | SO_5 (TO_1) | SO_6 (TO_1) | SO_7 (TO_1) | SO_8 (TO_2) | SO_9 (TO_2) | SO_10 (TO_4)

必须变成

SO_1 (TO_1) | SO_2 (TO_2) | SO_3 (TO_3) | SO_10 (TO_4) | SO_4 (TO_1) | SO_8 (TO_2) | SO_6 (TO_1) | SO_9 (TO_2) | SO_7 (TO_1) | SO_5 (TO_1)

最后,我想以 MaxDegreeOfParallelism = 5 运行 Parallel.ForEach(List),因此 5 个项目的每个循环永远不会同时具有相同的 TargetObject。

谢谢

4

2 回答 2

1

最简单的方法(至少是我能想到的最简单的方法)是首先按 TargetObject 对它们进行排序,然后按 TargetObject 对它们进行分组,并一次使用每个组的一个元素重新构建您的集合。

List<SomeObject> CustomSort( List<SomeObject> list)
{

  var ordered = list.OrderBy(x => x.TargetObject); // might not be necessary. Not sure if group by orders the group or not.
  var groups = ordered.GroupBy(x => x.x.TargetObject);
  List<SomeObject> res = new List<SomeObject>();

  int position = 0;
  while(res.Count < list.Count)
  {
    foreach (var grp in groups)
    {
        SomeObject current = grp.ElementAtOrDefault(position);
        if ( current != null) res.Add(current);
    }
    position ++;
  }
  return res;
}

PS:此代码未优化,仅用于演示该方法。

于 2012-10-21T10:42:33.047 回答
0

这是InterlaceBy我用于不同目的的扩展方法,但它似乎适用于您的情况。

List<int> list = new List<int>() {1,2,3,1,1,1,1,2,2,4 }; //your TO's
var newlist = list.InterlaceBy(x => x).ToList(); //1,2,3,4,1,2,1,2,1,1

public static partial class MyExtensions
{
    public static IEnumerable<T> InterlaceBy<T, S>(this IEnumerable<T> input, Func<T, S> selector)
    {
        return input
              .GroupBy(selector)
              .SelectMany(g => g.Select((x, i) => new { key = i, value = x }))
              .OrderBy(x => x.key)
              .Select(x => x.value);
    } 
}
于 2012-10-21T11:48:28.090 回答