Actualmente tengo un menú con elementos secundarios que se almacena en esta variable diccionario:¿Hay una colección Dictionary <string, object> que permita varias claves?
private Dictionary<string, UserControl> _leftSubMenuItems
= new Dictionary<string, UserControl>();
Así que añadir vistas a la p la sección "Cliente" de esta manera:
_leftSubMenuItems.Add("customers", container.Resolve<EditCustomer>());
_leftSubMenuItems.Add("customers", container.Resolve<CustomerReports>());
Pero ya que estoy usando un diccionario, que sólo puede tener una clave llamada "clientes".
Mi tendencia natural sería crear ahora una estructura personalizada con propiedades "sección" y "Ver", pero hay una colección de .NET es más adecuado para esta tarea, algo así como un "MultiKeyDictionary"?
RESPUESTA:
Gracias maciejkow, que amplió su sugerencia para conseguir exactamente lo que necesitaba:
using System;
using System.Collections.Generic;
namespace TestMultiValueDictionary
{
class Program
{
static void Main(string[] args)
{
MultiValueDictionary<string, object> leftSubMenuItems = new MultiValueDictionary<string, object>();
leftSubMenuItems.Add("customers", "customers-view1");
leftSubMenuItems.Add("customers", "customers-view2");
leftSubMenuItems.Add("customers", "customers-view3");
leftSubMenuItems.Add("employees", "employees-view1");
leftSubMenuItems.Add("employees", "employees-view2");
foreach (var leftSubMenuItem in leftSubMenuItems.GetValues("customers"))
{
Console.WriteLine(leftSubMenuItem);
}
Console.WriteLine("---");
foreach (var leftSubMenuItem in leftSubMenuItems.GetAllValues())
{
Console.WriteLine(leftSubMenuItem);
}
Console.ReadLine();
}
}
public class MultiValueDictionary<TKey, TValue> : Dictionary<TKey, List<TValue>>
{
public void Add(TKey key, TValue value)
{
if (!ContainsKey(key))
Add(key, new List<TValue>());
this[key].Add(value);
}
public List<TValue> GetValues(TKey key)
{
return this[key];
}
public List<TValue> GetAllValues()
{
List<TValue> list = new List<TValue>();
foreach (TKey key in this.Keys)
{
List<TValue> values = this.GetValues(key);
list.AddRange(values);
}
return list;
}
}
}
Respuesta 2:
Gracias Blixt por la punta sobre el rendimiento, aquí es GetAllValues con ese cambio:
public IEnumerable<TValue> GetAllValues()
{
foreach (TKey key in this.Keys)
{
List<TValue> values = this.GetValuesForKey(key);
foreach (var value in values)
{
yield return value;
}
}
}
Responder 2 re factorizar más:
Aquí es una manera mucho más sucinta a hacer lo mismo, gracias Keith:
public IEnumerable<TValue> GetAllValues()
{
foreach (var keyValPair in this)
foreach (var val in keyValPair.Value)
yield return val;
}
Para su método 'GetAllValues' puede usar la palabra clave' yield' en lugar de generar una nueva lista, que usa más memoria y es menos eficiente. – Blixt
Eso podría ser todo lo que necesita, pero no es una MultiDictionary completa. ¿Qué pasa con 'Eliminar'? ¿Enumerando valores? etc. –
De hecho, la solución adecuada aquí es no reinventar la rueda y usar una de las bibliotecas vinculadas en las respuestas, o buscar otra que haga más lo que necesita. Para un propósito tan general, seguramente encontrará uno que esté bien probado y optimizado. – Blixt