C# 按参数对集合linq查询排序

C# 按参数对集合linq查询排序,c#,linq,C#,Linq,有一个列表,SomeObject具有属性TargetObject。 我需要的是创建一个列表,其中一些对象具有以下TargetObject sou 1(TO_1)| sou 2(TO_2)| sou 3(TO_3)| sou 4(TO_1)| sou 5(TO_1)| sou 6(TO_1)| sou 7(TO_1)| sou 8(TO_2)| sou 9(TO_2)| sou 10(TO_4) 必须变成 sou 1(TO_1)| sou 2(TO_2)| sou 3(TO_3)| sou 10(

有一个列表,SomeObject具有属性TargetObject。 我需要的是创建一个列表,其中一些对象具有以下TargetObject

sou 1(TO_1)| sou 2(TO_2)| sou 3(TO_3)| sou 4(TO_1)| sou 5(TO_1)| sou 6(TO_1)| sou 7(TO_1)| sou 8(TO_2)| sou 9(TO_2)| sou 10(TO_4)

必须变成

sou 1(TO_1)| sou 2(TO_2)| sou 3(TO_3)| sou 10(TO_4)| sou 4(TO_1)| sou 8(TO_2)| sou 6(TO_1)| sou 9(TO_2)| sou 7(TO_1)| sou 5(TO_1)

最后,我想用MaxDegreeOfParallelism=5运行Parallel.ForEach(List),这样5个项目的每个循环将永远不会同时有相同的TargetObject


谢谢

最简单的方法(至少是我能想到的最简单的方法)是首先按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;
}
列表自定义排序(列表)
{
var ordered=list.OrderBy(x=>x.TargetObject);//可能不是必需的。不确定group by是否对组进行排序。
var groups=ordered.GroupBy(x=>x.x.TargetObject);
List res=新列表();
int位置=0;
while(res.Count

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

这是用于不同目的的
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);
    } 
}
List List=newlist(){1,2,3,1,1,1,1,2,4}//你的目标是什么
var newlist=list.InterlaceBy(x=>x.ToList()//1,2,3,4,1,2,1,2,1,1
公共静态部分类MyExtensions
{
公共静态IEnumerable InterlaceBy(此IEnumerable输入,函数选择器)
{
返回输入
.GroupBy(选择器)
.SelectMany(g=>g.Select((x,i)=>new{key=i,value=x}))
.OrderBy(x=>x.key)
.选择(x=>x.value);
} 
}

请您重新表述一下您的问题好吗?我不擅长重新表述,收集来自。。。这是我能做的最好的解释,对不起。