【发布时间】:2012-02-26 20:02:17
【问题描述】:
假设:
List<element>是哪个元素:
public class Element(){
int Weight {get;set;}
}
我想要实现的是,通过权重随机选择一个元素。 例如:
Element_1.Weight = 100;
Element_2.Weight = 50;
Element_3.Weight = 200;
所以
-
Element_1被选中的几率是 100/(100+50+200)=28.57% -
Element_2被选中的几率是 50/(100+50+200)=14.29% -
Element_3被选中的几率是 200/(100+50+200)=57.14%
我知道我可以创建一个循环、计算总数等...
我想了解的是,Linq 在 ONE 行中执行此操作的最佳方法是什么(或尽可能短),谢谢。
更新
我在下面找到了我的答案。我学到的第一件事是:Linq 不是魔法,它比精心设计的循环要慢。
所以我的问题变成了按重量找到一个随机元素,(没有尽可能短的东西:)
【问题讨论】:
-
所以你想要短代码,但你不在乎它很慢?
-
Linq 会比基于循环的代码慢。如果你想要快速的代码,你需要在
O(n)中预先计算,这样你就可以在O(1)中查找。但其代码会相对复杂。 -
你认为 Linq(to objects) 是如何工作的?魔法?它只是封装了循环,通常比手写循环慢 2-3 倍。 linq 的主要优点是代码更短更清晰。
-
LINQ 确实比自己编写有效的迭代算法要慢。使用 linq 的原因是它更易于阅读/使用,并且不太可能导致错误。
-
@CodeInChaos - 慢 2 到 3 倍真是夸张。
标签: c# linq weighted weighted-average