如何按类型订购列表?

Dar*_*Zon 5 c# linq algorithm extension-methods list

想象一下,你有一个名单List<Foo>.

Foo是一个抽象类,所以这可以是FooA,FooB,FooCFooD.而且我希望有一个扩展名List<T>,您可以按类型顺序订购这些元素.

例如,如果我有9个元素.

FooA, FooA, FooB, FooD, FooC, FooC, FooA, FooB, FooA
Run Code Online (Sandbox Code Playgroud)

按顺序排序将是.

FooA, FooB, FooC, FooD, FooA, FooB, FooC, FooA, FooA
Run Code Online (Sandbox Code Playgroud)

我正在尝试按照您指定的顺序对函数进行排序,在本例中,IE,它是:

new[] { typeof(FooA), typeof(FooB), typeof(FooC), typeof(FooD) }
Run Code Online (Sandbox Code Playgroud)

我试图创建这个扩展,但我没有得到任何东西.你能帮一下吗?我猜我可以用LINQ完成它.

dtb*_*dtb 6

您可以按类型对项目进行分组,按类型对组进行排序并交错组:

var groups = items.GroupBy(x => x.GetType())
                  .OrderBy(g => orderedTypes.IndexOf(g.Key))
                  .ToList();

var result = groups.First().Interleave(groups.Skip(1).ToArray());
Run Code Online (Sandbox Code Playgroud)

使用EvenMoreLINQInterleave方法.

foreach (var item in result)
{
    Console.WriteLine(item.GetType());
}
Run Code Online (Sandbox Code Playgroud)

输出:

FooA
FooB
FooC
FooD
FooA
FooB
FooC
FooA
FooA
Run Code Online (Sandbox Code Playgroud)