我明白有很多答案说如何使用LINQ计算百分位数,但我找不到任何相关的问题答案。
我有一个对象列表,其中包含持续时间作为我必须通过按名称对列表进行分组来计算百分位数的属性之一。在C#中使用linq是否有最简单的方法可以做到这一点。 我的对象如下所示:
class Performance{
public string Name { get; set; }
public Nullable<decimal> DurationMilliSeconds { get; set; }
public string typeName { get; set; }
}
答案 0 :(得分:2)
Random r = new Random();
int performers = 500;
var performances = Enumerable.Range(1, performers)
.Select(e => new Performance { Name="P"+e, DurationMilliSeconds=r.Next(5000)});
var pCount = performances.Count();
var percentiles = performances
.OrderBy(p => p.DurationMilliSeconds)
.Select((p, i) => new { p, i=i+1 })
.Select(p => new {
Name = p.p.Name,
Duration = p.p.DurationMilliSeconds,
Percentile = p.i / (decimal)pCount
});
答案 1 :(得分:0)
这将构建一个字典,用于映射Performance
的实例,按名称分组到组的DurationMilliSeconds
属性总和与所有Performance
个对象的总持续时间的百分比集合。假设null
持续时间为0。
var performances = Enumerable.Empty<Performance>();
var totalDuration = performances.Sum(p => p.DurationMilliSeconds ?? 0M);
var durationPercentages = performances
.GroupBy(p => p.Name)
.ToDictionary(
group => group.Key,
group => group.Sum(p => (p.DurationMilliSeconds ?? 0M))/totalDuration);