实现自己LINQ&的IEnumerable [关闭]
-
22-07-2019 - |
题
在一个项目,我的工作,真的有巨大的集合(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
接口例就好反正。
因此,可能不存在很多点在这种方法。