0

我有几个“数据源”,每个都提供有序的时间戳数据。我想将它展平为单个有序流(如合并排序)。这个答案描述了如何为两个可枚举做到这一点,但我不确定如何概括它。

数据源很大,所以我不能在内存中做,它必须被流式传输。

用一个例子来解释它,我有这样的东西:

interface IDataSource
{
    IEnumerable<DateTime> GetOrderedRecords();
}

我希望能够有这样的扩展方法:

// get all sources
IEnumerable<IDataSource> dataSources = GetAllSources();

// merge sort
IEnumerable<DateTime> flattened = dataSources
    .MergeSort(s => s.GetOrderedRecords());

[编辑]

我不能急切地加载所有内容然后对其进行排序的原因是因为我正在从多个数据库加载数据并将其导出到另一个数据库中。每个IDataSource基本上都是 Linq-to-NHibernate 引擎盖下,我有数以百万计的数据行要返回。

所以我需要的是:

  1. 从所有可用来源中,加载下一个时间戳。
  2. 将其存储到磁盘并“忘记它”。

数据源已经排序,这使得“合并排序”方法可行。

4

1 回答 1

2

您可以做的一件简单的事情是Merge从您链接的问题中连接对实现的调用:

public static IEnumerable<DateTime> Merge(this IEnumerable<IDataSource> dataSources)
{
    var result = Enumerable.Empty<DateTime>();

    foreach(var dataSource in dataSources)
    {
        result = result.Merge(dataSource.GetOrderedRecords(), (x, y) => x < y);
    }

    return result;
}

你可以这样称呼它:

var result = dataSources.Merge();

这样做的缺点是MoveNext,对返回的枚举的枚举器的每次调用都会在嵌套的枚举上产生相当多的 MoveNext 调用。

于 2012-10-10T10:16:52.407 回答