c# - LINQ - 对特定类型的类进行分组

标签 c# .net linq

这个问题类似于LINQ group one type of item但以更通用的方式处理。

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

List<BaseClass> list = new List<BaseClass>() {
  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<BaseClass> list = new List<BaseClass>() {
  new Class1(1),
  new Class1(2),
  new Class2(1),
  new Class3(1),
  new Class3(2)
  new Class2(2),
  new Class4(1),
};

编辑:糟糕,忘了说这个结果是假设 (Class1 and 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 个项目。

您可以将 g.First().GroupThisType 替换为 typesToGroup.Contains(g.Key)

关于c# - LINQ - 对特定类型的类进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2835492/

相关文章:

c# - 如果 GC 完成了它的工作,为什么我们会出现内存不足异常?

c# - 文本框属性

c# - LINQ 查找所有子实体满足要求

c# - 为 wpf 应用程序中的所有控件启用/禁用工具提示

c# - 在Azure Blob存储中,虚拟目录和容器之间有什么区别?

c# - 最小起订量 - 如果类吞噬异常,如何验证方法没有被调用

.net - 一旦用户对 datagridview 进行排序,我如何取回原始行索引?

c# - 配置设置和 IoC

c# - 如何在 Dynamic Linq 中编写 String.Contains

c# - 在我的模型中,我将哪种元素类型用于类型为 smalldatetime 的 SQL 表列?