これで LiveLinq でコレクションをクエリーできるため、コレクションにインデックスを作成する必要があります。そうしないと、LiveLinq は、標準の LINQ より高速にコレクションをクエリーすることができません。
たとえば、次のように、IIndexedSource<Customer> を実装するコレクションがあるとします。
C# |
コードのコピー
|
---|---|
var customers = new IndexedCollection<Customer>(); |
または、次のようにすることもできます。
C# |
コードのコピー
|
---|---|
var customers = CustomersDataTable.AsIndexed();
|
IIndexedSource<T> インタフェースは Indexes コレクションを持つため(実際には唯一のメンバ)、そのコレクションを使用して次のようにインデックスを作成します。
C# |
コードのコピー
|
---|---|
var indexByCity = customers.Indexes.Add(x => x.City);
|
これで、City に基づいて顧客のインデックスが作成されます。このインデックスは、一旦作成されると、customers コレクションが変更されるたびに自動的に管理されます。このメンテナンスにはパフォーマンスコストが伴います。このコストは大きくなく、インデックスメンテナンスは高速で、インデックスが多すぎない限り通常は無視できます。ただし、非常に集中的にコレクションを修正する場合は、検討事項になる可能性があります。
大きなインデックスメンテナンスコストを避けるために、たとえばコレクションにデータを挿入する場合など、インデックス付きのコレクションに大量の変更を行う場合は、BeginUpdate/EndUpdate メソッドを使用できます。
このインデックスは、次のようなクエリーを極めて高速に実行できます。
C# |
コードのコピー
|
---|---|
from c in customers where c.City == "London" |
これは、LiveLinq が、大きなコレクション全体を横断して必要な項目を検索するのではなく、インデックスを使用して項目に直接アクセスするためです。インデックスは、このような単純なクエリーだけでなく、さまざまなクエリーを高速化でき、(非等価の)範囲条件、結合、グループ化などの LINQ 演算子も高速化できます。インデックスのメリットがあるクエリークラスの詳細については、「LiveLinq クエリーパフォーマンス:インデックスパフォーマンスの調整」を参照してください。
上で説明したように、コレクションにインデックスを追加して明示的にインデックスを作成することは、インデックスのライフタイムを直接制御する場合や、インデックス(Index<T> オブジェクト)に直接アクセスしてプログラムで使用する場合(「プログラムでインデックスを使用する方法」を参照)にのみ必要になります。少数の LiveLinq クエリーを最適化する必要があるだけの場合は、代わりに、インデックスを作成する暗黙のメソッドを使用できます。これを LiveLinq クエリーの "ヒント" と呼びます。ヒント .Indexed() は、クエリー内のプロパティに適用できる拡張メソッドです。プロパティの値は変更されません。これは、(可能な場合は)そのプロパティにインデックスを作成することを LiveLinq に指示するだけです。したがって、上の例のように、明示的に City に基づいてインデックスを作成する代わりに、次のようにクエリーを記述できます。
C# |
コードのコピー
|
---|---|
from c in customers where c.City.Indexed() == "London" |
これは、まだ作成されていない場合は、City に基づいてインデックスを作成するように LiveLinq に指示します。このヒントは、プロパティの値に影響しません。つまり、c.City.Indexed() の値は、c.City の値と同じです。