Al momento ho un menu con elementi secondari che viene memorizzato in questa variabile dizionario:Esiste una collezione di dizionari <stringa, oggetto> che consente più chiavi?
private Dictionary<string, UserControl> _leftSubMenuItems
= new Dictionary<string, UserControl>();
Così ho aggiungere viste al es la sezione "Cliente" come questo:
_leftSubMenuItems.Add("customers", container.Resolve<EditCustomer>());
_leftSubMenuItems.Add("customers", container.Resolve<CustomerReports>());
Ma dal momento che sto usando un dizionario, che può avere solo una chiave denominata "clienti".
La mia tendenza naturale sarebbe quello di creare ora una struct personalizzato con proprietà "Sezione" e "vista", ma c'è una collezione di .NET è più adatto per questo compito, qualcosa come un "MultiKeyDictionary"?
RISPOSTA:
Grazie maciejkow, ho ampliato il suo suggerimento per ottenere esattamente quello che mi serviva:
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;
}
}
}
Risposta 2:
Grazie Blixt per la punta su rendimento, ecco GetAllValues con tale modifica:
public IEnumerable<TValue> GetAllValues()
{
foreach (TKey key in this.Keys)
{
List<TValue> values = this.GetValuesForKey(key);
foreach (var value in values)
{
yield return value;
}
}
}
Risposta 2 re scomposto ulteriormente:
Ecco un modo molto più succinta per fare la stessa cosa, grazie Keith:
public IEnumerable<TValue> GetAllValues()
{
foreach (var keyValPair in this)
foreach (var val in keyValPair.Value)
yield return val;
}
Per il metodo 'GetAllValues' è possibile utilizzare la parola chiave' yield' invece di generare un nuovo elenco, che utilizza più memoria ed è meno efficiente. – Blixt
Potrebbe essere tutto ciò di cui hai bisogno, ma non è un completo MultiDictionary. Che dire di 'Rimuovi'? Enumerazione dei valori? ecc. –
In effetti, la soluzione corretta qui è non reinventare la ruota e utilizzare una delle librerie collegate nelle risposte, o cercarne un'altra che faccia di più ciò di cui si ha bisogno. Per un tale scopo generale, ne troverai sicuramente uno ben testato e ottimizzato. – Blixt