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:
IGrouping
desde una consulta LINQ como ToLookup
y GroupBy
y agregándola a su lista. 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.