현재이 사전 변수에 저장된 하위 항목이있는 메뉴가 있습니다.여러 개의 키를 허용하는 Dictionary <string, object> 컬렉션이 있습니까?
private Dictionary<string, UserControl> _leftSubMenuItems
= new Dictionary<string, UserControl>();
"고객"섹션은 다음과 같습니다.
_leftSubMenuItems.Add("customers", container.Resolve<EditCustomer>());
_leftSubMenuItems.Add("customers", container.Resolve<CustomerReports>());
그러나 사전을 사용하고 있으므로 는 "customers"라는 하나의 키만 가질 수 있습니다.
내 자연적인 경향은 이제 "단면도"와 "보기"속성이있는 사용자 지정 구조체를 만드는 것이지만 은 .NET 컬렉션이 "MultiKeyDictionary"와 같은이 작업에 더 적합합니까?
답변 :
덕분에 maciejkow, 내가 필요로 정확하게 얻을 수 있도록 제안을 확장 :
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;
}
}
}
이 답변
: 여기, 수율에 대한 팁을위한
감사 Blixt 것은 GetAllValues입니다 그 변화와 함께 :
public IEnumerable<TValue> GetAllValues()
{
foreach (TKey key in this.Keys)
{
List<TValue> values = this.GetValuesForKey(key);
foreach (var value in values)
{
yield return value;
}
}
}
답변 2 리팩터링 더 :
다음과 같은 일을 훨씬 더 간결한 방법, 감사합니다 키이스 :
public IEnumerable<TValue> GetAllValues()
{
foreach (var keyValPair in this)
foreach (var val in keyValPair.Value)
yield return val;
}
당신의'GetAllValues' 메쏘드에 대해 새로운 목록을 생성하는 대신'yield' 키워드를 사용할 수 있습니다.이 목록은 더 많은 메모리를 사용하며 덜 효율적입니다. – Blixt
그게 전부일지도 모르지만 그것의 거의 완전한 다국어. '제거 '는 어떨까요? 값을 열거 하시겠습니까? –
실제로 적절한 해결책은 바퀴를 재발 명하지 않고 답변에 링크 된 라이브러리 중 하나를 사용하거나 필요한 것을 더하는 다른 것을 찾아 보는 것입니다. 이러한 일반적인 목적을 위해 잘 테스트되고 최적화 된 것을 찾으십시오. – Blixt