LINQ - Group Class Types

This question is similar to the LINQ group on one type of item , but handled in a more general way.

I have a list that has various derived classes. I might have something like this:

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)
};

I'm trying to use LINQ to parse a list so that the natural order is maintained by EXCEPT for certain classes that have base.GroupThisType == true. All classes with GroupThisType should be grouped where the first class of the same type occurs. Here's what the output should look like:

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),
};

Edit: Oh, forgot to say that this result assumes (Class1 and Class3) .GroupThisType == true

+5
source share
3

:

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

, : , . 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}));
+1

OrderBy LINQ IComparer. , . , , ( , ). , Class1, Class2 ?

.

0

All Articles