【发布时间】:2013-02-14 21:23:10
【问题描述】:
我正在创建一项服务,以使用户可以轻松地从IANA - Protocol Registry 中选择协议。
正如您可能想象的那样,在注册表中搜索术语 http 会获得很多点击。由于用户选择amt-soap-http 的频率比直接选择http 的频率要低得多,因此我决定提取以http 开头的所有内容,然后将其与其余结果连接起来。
下面的 lambda 表达式是该思考过程的结果:
var records = this._ianaRegistryService.GetAllLike(term).ToList();
var results = records.Where(r => r.Name.StartsWith(term))
.OrderBy(r => r.Name)
.Concat(records.Where(r => !r.Name.StartsWith(term))
.OrderBy(r => r.Name))
.Take(MaxResultSize);
不幸的是,我觉得我对结果的迭代次数超出了必要的次数。除了过早的优化考虑之外,是否存在比上述更有效的 lambda 表达式组合?
【问题讨论】:
-
对于那些不知道
Orderby和GroupBy+SelectMany之间区别的人(如@Bobson 和支持者):一个是n*Log(n)操作,另一个是n -
@I4V 使用这些知识有没有比answer D Stanley provided 更有效的答案?
-
ahsteele,我给了一个,但在 3 次否决后我删除了它(因为我写了 我还没有测试过)
-
@I4V 很抱歉你被否决了。不幸的是,我没有看到答案。
-
MaxResultSize多久超过以term开头的名称数量?考虑到Concat的懒惰性质,但 eager 的方式是在您获取第一个值后立即按OrderBy对值进行排序,要求 1000 个项目和要求 1001 个项目之间的区别可能是巨大的。