2010-01-06 35 views
11

he un objeto, que tiene muchas propiedades, pero los dos únicos que preocuparse son:Obtener una lista de elementos distintos y su recuento de

myobject.ID que es un int
myobject.Names que es un HashSet

entonces tengo una List de esos objetos que se ve algo similar a esto:

List<myobject> 

uso de LINQ para conseguir un modo me de los datos en un repetidor, pero no estoy seguro de cómo obtener la lista de nombres y la frecuencia con que aparecen.

Quiere utilizar Linq para evitar tener que recorrer los datos.

Como deberían mostrar mis etiquetas, esta es una solución ASP.NET que usa C#.

algunas aclaraciones:
Digamos que tengo sólo tres artículos en mi lista: artículo 1 tiene John, Fred, Jack en sus nombres. El elemento 2 tiene a John, Fred, Joe en sus nombres. El elemento 3 tiene a John en sus nombres.

que estoy tratando de devolver el siguiente: John - 3 Fred - 2 Jack - 1 Joe - 1

También, como una nota que estoy familiarizado con tener que escribir mi propio comparador para mi objeto , Me falta el 'cómo hacerlo' para la solución general en mis pensamientos.

+1

Hola, cuando dices "cómo obtener la lista de nombres y con qué frecuencia aparecen". : ¿quiere decir que desea contar el número de instancias de 'myobject en la lista donde la propiedad' .Names contiene un puntero a una lista válida (HashSet); en otras palabras, el valor de la propiedad '.Names no es nulo? ¿O desea construir una nueva colección de 'myObject que contenga solo aquellos con un vaid HashSet en la propiedad' .Names? Una pequeña aclaración, por favor. – BillW

+0

Aclaración añadida. –

Respuesta

18

Así entiendo el problema que está tratando de resolver. Usted tiene una lista de myobject s. Cada myobject tiene una propiedad llamada Names que es HashSet de string s (es decir, HashSet<string>). Desea contar la cantidad de veces que aparece cada string en algunos myobject.Names en todos los myobject.Names. Es decir, usted tiene

"Alice", "Bob", "Charlie" 
"Alice", "Bob", "Donald" 
"Alice", "Donald", "Ernie" 

como tres myobject.Names y que desea ver

"Alice", 3 
"Bob", 2 
"Charlie", 1 
"Donald", 2 
"Ernie", 1 

Si es así:

var query = list.SelectMany(x => x.Names) 
       .GroupBy(s => s) 
       .Select(g => new { Name = g.Key, Count = g.Count() }); 

foreach(var result in query) { 
    Console.WriteLine("Name: {0}, Count: {1}", result.Name, result.Count); 
} 

no veo qué papel juega aquí myobject.ID. Por favor calificar

+0

myobject.ID realmente no desempeña ningún papel, solo quería dejar en claro que no era un simple objeto HashSet. –

+0

Bien. Entonces creo que lo anterior aborda su pregunta. Avíseme si algo necesita aclaración. – jason

+1

Su ejemplo tiene GroupBy (s), pero s no existe. –

5
var query = yourList 
      .SelectMany(x => x.Names) 
      .GroupBy(x => x, (y, z) => new { Name = y, Count = z.Count() }); 

// and to test... 
foreach (var item in query) 
{ 
    Console.WriteLine("{0} - {1}", item.Name, item.Count); 
} 
Cuestiones relacionadas