LINQ - 组特定类的类

时间:2010-05-14 15:46:21

标签: c# .net linq

此问题与LINQ group one type of item类似,但以更通用的方式处理。

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

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和Class3).GroupThisType == true

3 个答案:

答案 0 :(得分:1)

像这样:

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)

答案 1 :(得分:1)

这是一个使用两个传递的解决方案:在第一个我构建一个应该分组的所有那些的字典。在第二部分中,我使用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}));

答案 2 :(得分:0)

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

HTH。