LINQ – 组特定类的类

这个问题类似于LINQ group one类型的项目,但是以更通用的方式处理。

我有一个包含各种派生类的List。 我可能有这样的事情:

List list = new List() { new Class1(1), new Class2(1), new Class1(2), new Class3(1), new Class2(2), new Class4(1), new Class3(2) }; 

我正在尝试使用LINQ对列表进行半排序,以便为某些具有base.GroupThisType == true的类保持自然顺序。 具有GroupThisType的所有类应该在发生相同类型的第一个类的位置组合在一起。 这是输出应该是什么样的:

 List list = new List() { new Class1(1), new Class1(2), new Class2(1), new Class3(1), new Class3(2) new Class2(2), new Class4(1), }; 

编辑:糟糕,忘了说这个结果是假设的(Class1和Class3).GroupThisType == true

像这样:

 list = list.Select((o, i) => new { Index = i * 10000, Value = o }) .GroupBy(q => q.GetType()) .SelectMany(g => { if (g.First().GroupThisType) return g.Select((q, i) => new { Index = g.First().Index + i, Value = q.Value } ); else return g; }) .OrderBy(q => q.Index) .Select(q => q.Value) .ToList(); 

i * 10000允许组中最多10,000个项目插入任意两个项目之间。

您可以使用typesToGroup.Contains(g.Key)替换g.First().GroupThisType

这是一个使用两个传递的解决方案:在第一个我构建一个应该分组的所有那些的字典。 在第二部分中,我使用SelectMany来收集未与整理的任何元素的第一个整理序列进行整理的元素。

 // Build a dictionary of the items that group var onesToGroup = list.Where(x => x.GroupThisClass) .GroupBy(x => x.GetType()) .ToDictionary(x => x.Key, x => x.AsEnumerable()); var results = list.SelectMany(x => x.GroupThisClass ? (onesToGroup[x.GetType()].First() == x ? onesToGroup[x.GetType()] : (new BaseClass[]{})) : (new []{x})); 

OrderBy LINQ方法可以接受IComparer通用接口。 您可以使用它来实现自定义排序算法。 我不知道默认排序可以处理你想要做的事情(它将取决于你需要实现的所有规则)。 我假设你的类实际上没有命名为Class1,Class2,类型名称中的排序?

HTH。