私は同じケースでキーで値を見ることができるようにしたい、そして他のケースではコレクションを通して反復することができます。KeyValueではなくIEnumerable <ValueType>のIDictionary?
は、以前私はこれをやっていた:
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 ...
今、私はそれを効率的にためて、私はまた、固有名のために一致する文字列で、チェックボックスリストのようないくつかの他のコレクションを反復処理する必要があるいくつかの場所を持っている私が変更Departmentsを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 ...
また、私はこれらのリストを初期化するたびにです。KeyValueをIDictionaryのにリストを変換したり、追加することのために気にしません。
理想的には、ICollectionのように動作するコレクションがありますが、インデックス演算子もあり、辞書に内部的にアクセスする関数が含まれています。
OR私はそうのような2つのプロパティを持っているだろう、同期している滞在:
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ことができなかったということです実際には辞書に追加する必要があります(setを実装すると、getを使ってcllectionを取得してアイテムを追加できるため、setを実装することはできません)。
あまりにも多くのコードを再作成するのではなく、 Dictionaryから自動的にIEnumerableを継承します。インターフェイスを明示的に実装しても、ユーザーがそのベースインターフェイスにキャストした場合に問題が発生する可能性があります。
本質的にIEnumerableを実装するクラスが必要ですが、効率のために内部的に辞書を利用するContainsと[]演算子もあります。
また、Departmentsコレクションと同期している追加DepartmentByUniqueName辞書プロパティを作成することもできます。
理由だけではなく、辞書の 'Values'プロパティを使用していませんか? –
プロパティはDepartmentKeyValuePairsではなくDepartmentsと呼ばれるためです。実際に辞書が単なるインデックスである場合は、あらゆるユースケースで常に.Valueまたは.Valuesにアクセスする意味がほとんどありません。 .Add。にキーを常に渡す必要はありません。対照的に、KeyedCollectionは素晴らしいです。なぜなら、アイテムを追加するたびにKeyのこのプロパティを使用するというコレクションにそのロジックを書き込むからです。 ICollectionではなく、ICollection です。 'KeyedCollection'の提案に対しては –
AaronLS