いくつかの「データ ソース」があり、それぞれが順序付けられたタイムスタンプ付きデータを提供します。それを単一の順序付けられたストリーム (マージソートなど) にフラット化したいと思います。この回答は、2 つの列挙型に対してそれを行う方法を説明していますが、それを一般化する方法がわかりません。
データ ソースは膨大なため、メモリ内では実行できず、ストリーミングする必要があります。
例で説明すると、次のようなものがあります。
interface IDataSource
{
IEnumerable<DateTime> GetOrderedRecords();
}
次のような拡張メソッドを使用できるようにしたいと思います。
// get all sources
IEnumerable<IDataSource> dataSources = GetAllSources();
// merge sort
IEnumerable<DateTime> flattened = dataSources
.MergeSort(s => s.GetOrderedRecords());
[編集]
すべてを熱心に読み込んで並べ替えることができない理由は、複数のデータベースからデータを読み込んで別のデータベースにエクスポートしているためです。それぞれIDataSource
は基本的に、Linq から NHibernate への内部処理であり、何百万ものデータ行を返す必要があります。
だから私が必要とするのは次のようなものです:
- 利用可能なすべてのソースから、次のタイムスタンプをロードします。
- ディスクに保存して「忘れて」ください。
データ ソースは既にソートされているため、"マージ ソート" アプローチが実行可能になります。