在一个项目,我的工作,真的有巨大的集合(1M-1B族元素),事物修改藏品居多。

这是一个实时应用程序,所以性能是至关重要的。

有关的一些操作,如反向,BinarySearch的(可能的?)的等将遭受比其他人等选择,等等等等。

是否可行实现自己的IEnumerable有可能的MoveNext,MovePrev等和自己实施了利用这些优势LINQ扩展?

如果这是要发生的事,它会发生在项目结束。因为我们需要得到它第一次工作,然后让它更快一点。

这所有的一切不应该太多的工作,对吧?

有帮助吗?

解决方案

这是非常肯定可以创建自己的实现Enumerable的可能特殊情况的一些情况。你基本上要检测你自己的集合类型(或者可能只是集合,如List<T>),并使用更有效的实现适用。

我有我用来演示“在一个小时执行LINQ到对象的示例项目 “你可能喜欢看的例子。这不是一个完整的执行情况,特别是的比真正的LINQ到对象有效的 - 但你可能仍然觉得很有意思

另外,你可能会发现 i4o的(索引LINQ)确实需要开箱一切 - 或者,你会离开有助于该不是从头开始更好。值得检查。

只要记住,在一天结束时,LINQ基本上是一个不错的设计加上语法糖。 C#编译器不知道的任何的特别之处System.Linq.Enumerable,例如。

其他提示

如果你真的想表现,你可以做不少。请记住,以下的选择:

var result = from element in collection
             where element.Id == id
             select element;

编译为:

var result = collection.Where(element => element.Id == id);

如果你创建collection的类型下面的方法,则可以利用以下事实:主要操作是ID构件的平等和处理以优化的方式的请求。最重要的是正确识别您的收藏性能关键的操作并选择正确的算法(即复杂性)来执行它们。

public IEnumerable<TElement> Where(Expression<Func<TElement, bool>> selector)
{
    // detect equality of the Id member and return some special value
}

考虑System.Linq.Enumerable.Reverse() - 此方法完全返回第一结果之前枚举了IEnumerable

如果您的查询是myCollection.Reverse()。以(10),以及您的收藏物品具有数十亿,这是一个可怕的想法列举项目的数十亿美元获得10出来。

如果您对自己的类型提供一个反向的方法,你可以提供一个更好的实现,它只是向后遍历集合(通过指数可能)。

这里的关键是提供自己的类型,你控制的实现。您不能使用所有IEnumerable<T>工作的实现,因为这些的实现不会占用您的自定义集合类型的功能和优势。

  

是否可行实现自己   IEnumerable的有可能的MoveNext,   MovePrev等,并拥有实现LINQ   称取的优势扩展   这些?

IEnumerable(或更恰当地,IEnumerator)不具有MovePrev。可以定义一个接口:

public interface IReversable<T> : IEnumerable<T>
{
    IEnumerator<T> GetReverseEnumerator();
}

这可以由不支持高效反向枚举的任何容器中实现。

您可以接着写Reverse(扩展方法)的超负荷工作过这个新的接口,并实现该接口等集合类,然后你就必须使用这些集合类,而不是标准的像List<T>

但(我没有反光方便检查),它可能是内置Reverse是足够聪明,做事情的快捷方式,如果它可以从收集,这将优化最常见的IList接口例就好反正。

因此,可能不存在很多点在这种方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top