我希望能夠在相同情況下通過鍵查看值,並在其他情況下遍歷集合。IDictionary是IEnumerable <ValueType>而不是KeyValue?
以前我是這樣做的:
public class Company
{
public string Name { get; set; }
public ICollection<Department> Departments { get; set; }
}
public class Department
{
public string Name { get; set; } //display name
public string UniqueName { get; set; } //like a code value
public bool IsSelected { get; set; }
}
foreach(var d in someCompany.Departments) ...
var departments = someCompany.Departments.Select(d => some projection stuff ...
現在我有幾個地方我還需要通過一些其他集合像複選框來迭代匹配的UniqueName字符串,所以它是有效的,我改變了列出將部門聲明爲IDictionary,但這會使其他用例更加繁瑣,總是要求我鑽取一個Value或Values。因此,現在Departments屬性不再是Department類的集合,而是一組KeyValue對。
foreach(ListItem item in someCheckBoxes.Items)
{
someCompany.Departments[item.Value].Selected = true;
}
foreach(var d in someCompany.Departments.Values) ...
var departments = someCompany.Departments.Values.Select(d => some projection stuff ...
我也不在乎必須將列表轉換爲IDictionary,或者在我初始化這些列表時添加一個KeyValue。
理想情況下,我將擁有一個集合,其行爲像一個ICollection,但也有一個索引操作符幷包含一個內部訪問字典的函數。
OR我有兩個屬性,像這樣,那留在同步:
public Company(string uniqueName, string name, ICollection<Department> departments)
{
Name = name;
UniqueName = uniqueName;
DepartmentsByUniqueName = departments.ToDictionary<Department, string>(p => p.UniqueName);
}
public IDictionary<string,Department> DepartmentsByUniqueName { get; set;}
public ICollection<Department> Departments { get { return DepartmentsByUniqueName.Values; } }
public void AddDepartment(Department department)
{
DepartmentsByUniqueName.Add(department,department.UniqueName)
}
這裏的問題是,有人可以通過部門屬性獲取值集合,並添加/刪除項目到它,而不是reallizing他們確實需要被添加到字典中(實現集並不能解決這個問題,因爲他們通過獲取來得到回調,然後可以添加項)。
嘗試不重新創建太多的代碼,而是繼承從Dictionary自動使它繼承IEnumerable。即使我做了明確的接口實現,如果用戶將其轉換爲基本接口,也會出現問題。
所以基本上我想要一個實現IEnumerable的類,但也有一個Contains和[]運算符,它們在內部利用字典來提高效率。
或者能夠創建與Department部門集合保持同步的額外DepartmentByUniqueName字典屬性。
爲什麼不直接使用字典的'Values'屬性時需要迭代? – 2012-01-27 22:28:37
因爲該屬性稱爲Departments,而不是DepartmentKeyValuePairs。在每個用例中總是訪問.Value或.Values時,它的語義意義不大,因爲實際上字典只是一個索引。總是將密鑰傳遞給.Add。也是不必要的。相比之下,KeyedCollection非常棒,因爲您將該邏輯烘焙到集合中,每次添加項目時都會使用該屬性作爲Key。而不是ICollection它是一個ICollection 。 –
AaronLS
2012-02-02 22:50:09