¿Cómo funciona el método LINQ To Objects GroupBy? ¿Se ve a través de toda la colección para cada clave? ¿Hay alguna manera de decir al método GroupBy que la colección está ordenada?LINQ to Objects GroupBy método
Respuesta
GroupBy, si se hace con sensatez, funcionaría en un único pase hacia adelante solo. Una implementación básica (no el suyo) sería algo comparables a:
var data = new Dictionary<TKey, List<TValue>>(comparer);
foreach(var item in source) {
var key = keySelector(item);
List<TValue> list;
if(!data.TryGetValue(key, out list))
{
data.Add(key, list = new List<TValue>());
}
list.Add(itemSelector(item));
}
que, básicamente, por los grupos clave, la creación de una lista para cada clave única, que contiene los valores.
podría hacer cosas como comparar con la última clave (para ayudar con los datos ordenados), pero ... necesitaría un perfil para saber si vale la pena.
vamos a ver en la sobrecarga de
IEnumerable<IGrouping<TKey, TSource>> Enumerable.GroupBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
);
como el más simple de entender. Efectivamente el código va a hacer algo como esto:
enumerar source
Para cada element
en origen, elemento de mapa de key = keySelector(element)
Ver si key
es en un diccionario introducido por TKey
si no lo es, agregue el key
con el valor a List<TSource>
y el primer artículo element
else, obtenga el List<TSource>
asociado a la clave y agregue element
a la lista
Ahora tiene una asignación de diccionario TKey
->TSource
y puede producir fácilmente una secuencia de IGrouping<TKey, TElement>
.
así que algo como
var dictionary = new Dictionary<TKey, List<TSource>> dictionary;
foreach(var element in source) {
key = keySelector(element);
List<TSource> list;
if(!dictionary.TryGetValue(key, out list)) {
list = new List<TSource>();
dictionary.Add(key, list);
}
list.Add(element);
}
Desde aquí se puede producir fácilmente una secuencia de IGrouping<TKey, TSource>
.
No veo por qué crees que la lista que se está ordenando importa.
¿Se ve en toda la colección para cada clave?
No. La aplicación de GroupBy es O (n), no O (n^2)
- 1. LINQ to XML GroupBy
- 2. LINQ to Objects Optimization Techniques?
- 3. Distinto no funciona con LINQ to Objects
- 4. Linq to Objects: does GroupBy conserva el orden de los elementos?
- 5. Tus consultas favoritas de LINQ-to-Objects
- 6. ¿Dónde y cuándo usar LINQ to Objects?
- 7. .NET Linq to Objects comportamiento extraño
- 8. Operador Me gusta en LINQ to Objects
- 9. LINQ to Objects incremento automático número
- 10. "Nested foreach" vs "lambda/linq query" performance (LINQ-to-Objects)
- 11. LINQ to Objects y performance mejorada con un índice?
- 12. C# LINQ to Objects: Group By/Sum help
- 13. LINQ groupby pregunta
- 14. Colección LINQ GroupBy
- 15. LINQ To Entities no reconoce el método Last. De Verdad?
- 16. Rendering C# Objects to Html
- 17. Dynamic LINQ GroupBy Columnas múltiples
- 18. LINQ con GroupBy y contar
- 19. Linq-to-entidades - Incluir método() no cargar
- 20. LINQ to Entities no reconoce el método
- 21. LINQ to SQL - No Agregar método disponible
- 22. Linq-to-Entities Incluir método no encontrado
- 23. NotSupportedException con consulta linq y groupBy
- 24. ¿Cómo se usa GroupBy correctamente en LINQ?
- 25. declaración groupby LINQ con la clave
- 26. ¿Cómo puedo GroupBy esta consulta LINQ?
- 27. Linq al usar GroupBy, Include no funciona
- 28. LINQ a SQL GroupBy Max() lambda
- 29. LINQ to SQL: GroupBy() y Max() para obtener el objeto con la fecha más reciente
- 30. Por qué IQueryable es dos veces más rápido que IEnumerable al usar Linq To Objects
Si la lista se clasificaron, se podrían producir IGrouping sin procesar toda la lista – SiberianGuy
@Idsa: explicar. – jason
si la lista se ordenó por la clave, y usted lo sabía, podría construir un objeto IGrouping y luego 'devolverlo 'tan pronto como cambie el valor de la clave, y luego comenzar una nueva IGrouping. @Idsa - no sería muy difícil hacer un método de extensión 'GroupBySorted' y luego perfilarlo para ver si tiene algún beneficio práctico sobre el' GroupBy' común ... –