C# LINQ组一种类型的项目

C# LINQ组一种类型的项目,c#,.net,linq,C#,.net,Linq,我有一个包含各种派生类的列表。我可能有这样的想法: List<BaseClass> list = new List<BaseClass>() { new Class1(), new Class2(1), new Class3(), new Class2(2), new Class4() }; list = list .TakeWhile(o => !(o is Class2)) .Concat(list.Where(o =>

我有一个包含各种派生类的列表。我可能有这样的想法:

List<BaseClass> list = new List<BaseClass>() {
  new Class1(),
  new Class2(1),
  new Class3(),
  new Class2(2),
  new Class4()
};
list = list
    .TakeWhile(o => !(o is Class2))
    .Concat(list.Where(o => o is Class2))
    .Concat(
        list.SkipWhile(o => !(o is Class2)).Where(o => !(o is Class2))
    )
    .ToList();
List List=新列表(){
新类别1(),
新类别2(1),
新类3(),
新类别2(2),
新类别4()
};
我正在尝试使用LINQ对列表进行半排序,以便除了类2之外,保持自然顺序。所有Class2实例都应该在第一个Class2出现的位置分组在一起。以下是输出应该是什么样的:

List<BaseClass> list = new List<BaseClass>() {
  new Class1(),
  new Class2(1),
  new Class2(2),
  new Class3(),
  new Class4()
};
List List=新列表(){
新类别1(),
新类别2(1),
新类别2(2),
新类3(),
新类别4()
};

我一辈子都想不出怎么做…

你可以这样做:

List<BaseClass> list = new List<BaseClass>() {
  new Class1(),
  new Class2(1),
  new Class3(),
  new Class2(2),
  new Class4()
};
list = list
    .TakeWhile(o => !(o is Class2))
    .Concat(list.Where(o => o is Class2))
    .Concat(
        list.SkipWhile(o => !(o is Class2)).Where(o => !(o is Class2))
    )
    .ToList();

这将占用所有项,直到第一个
Class2
项,然后是所有
Class2
项,然后是所有剩余的非
Class2
项。

是否尝试根据类的名称对列表进行排序?我不确定我是否遵循。@Ryan:他想将特定类的所有实例移动到第一个实例的位置。“看我的答案!”瑞安,斯莱克斯就是这么说的。在本例中,类的名称恰好是按顺序排列的,但它可以是任何名称(Foo、Bar、Cheese…)。在OfType调用之后需要一个.Cast(),以便可以连接列表。我还没有测试它,但您做得对。马丁:是的;我忘了这一点,我想他不是明确地指Class2,他是指Class2有多个实例(在本例中),它们都需要一起出现。其余的将按自然顺序出现。很可能有多个Class3、Class4等实例。@Anthony:没有。他只想移动
Class2
实例。