¿Es posible crear algún objeto IGrouping?

Tengo List<IGrouping> .

¿Es de alguna manera posible agregar un nuevo elemento a esta lista? O, de hecho, ¿es posible crear algún objeto IGrouping?

Si realmente quería crear su propio IGrouping , es una interfaz simple de implementar:

 public class MyGrouping : List, IGrouping { public TKey Key { get; set; } } 

Esta clase hereda de List e implementa la interfaz IGrouping . Además del requisito de ser un IEnumerable e IEnumerable (que List satisface) la única propiedad para implementar es Key .

Desde aquí puede crear todos los MyGrouping s que desee y agregarlos a su List> .

A partir de .NET 4.0, no parece haber ningún tipo público en el BCL que implemente la IGrouping , por lo que no podrá ‘actualizar uno’ con facilidad.

Por supuesto, no hay nada que lo detenga:

  1. Creando usted mismo un tipo concreto que implemente la interfaz, como lo señala @Nathan Anderson.
  2. Obteniendo una instancia / instancias de IGrouping desde una consulta LINQ como ToLookup y GroupBy y agregándola a su lista.
  3. Llamar a ToList() en una secuencia existente de grupos (desde ToLookup / GroupBy).

Ejemplo:

 IEnumerable foos = .. var barsByFoo = foos.ToLookup(foo => foo.GetBar()); var listOfGroups = new List>(); listOfGroups.Add(barsByFoo.First()); // a single group listOfGroups.AddRange(barsByFoo.Take(3)); // multiple groups 

Sin embargo, no está claro por qué querrías hacer esto.

 IGrouping CreateGroup(IEnumerable theSeqenceToGroup, TKey valueForKey) { return theSeqenceToGroup.GroupBy(stg => valueForKey).FirstOrDefault(); } 

También puede hackear la agrupación al no agrupar en algo dentro de la lista:

 var listOfGroups = new[] { "a1", "a2", "b1" } .GroupBy(x => x.Substring(0, 1)) .ToList(); // baz is not anything to do with foo or bar yet we group on it var newGroup = new[] { "foo", "bar" }.GroupBy(x => "baz").Single(); listOfGroups.Add(newGroup); 

listOfGroups entonces contiene:

 a: a1, a2 b: b1 baz: foo, bar 

Ejemplo IDEOne

 var headers = from header in new[] { new { Name = "One", List = new[] { "One 1", "One 2", "One 2" } }, new { Name = "Two", List = new[] { "Two 1", "Two 2", "Two 2" } } } from value in header.List group value by header.Name; 

La interfaz IGrouping es para el operador GroupBy() en LINQ. Normalmente obtendrías un objeto IGrouping de una consulta LINQ con una cláusula group by . Sin embargo, no tiene mucho sentido tener una lista de agrupaciones.