【问题标题】:Linq operator to aggregate matching value and weight themLinq 运算符聚合匹配值并对其加权
【发布时间】:2021-01-03 14:34:05
【问题描述】:

工作代码。

  double[] confirmingList = new double[] { -3, -2, -1 };
    
    var Tdb = rDatas
        .Select(d => new
        {
            TScore = (new List<double> {
                d.T15Min, // Let this count .2
                d.T30Min, // .25
                d.T65Min, // .3
                d.T130Min, // .4
                d.T195Min, // .5
                d.TDaily,  // .8
                d.TWeekly // 1
                }).Count(c => confirmingList.Contains(c))

我想要的是按时间框架匹配和按属性加权进行聚合。有没有一些Linq Kung Fu可以做到这一点?我应该有一些我通过属性名称乘以权重的类吗?我怀疑聚合运算符中存在允许这样做的东西?

在通过修改或加权聚合值时,无法真正找到显示逻辑运算匹配的内容。

【问题讨论】:

  • 我没有得到你的确切需求,你能改进你的解释/代码吗?
  • 我有属性,如果这些属性与数组中的一个匹配,那么我想在总数中添加一个分数。附加值将在每个时间范围内按比例增加并添加到分数中。这是为了比较短的时间框架更重视较长的时间框架。
  • @SuperDave 请尝试与我们分享尽可能多的代码,以便能够在任何人的机器上重现问题。
  • 由于我不知道答案,我无法真正发布代码。如前所述,我不只是想计算列表中匹配的项目,而是匹配它们并根据它们所处的时间范围对结果进行加权。上面的代码匹配并计算匹配项。然后如何为他们匹配的属性添加一个公式并汇总总数。
  • 什么是“他们匹配的属性的公式”?也许如果您添加了一些实际数据和结果?权重在哪里?

标签: linq count aggregate weighting


【解决方案1】:

使用索引的Select 方法,您可以将每个时间范围与其应该计算的权重相匹配:

double[] confirmingList = new double[] { -3, -2, -1 };
var weights = new[] { 0.2, 0.25, 0.3, 0.4, 0.5, 0.8, 1.0 };

var Tdb = rDatas
    .Select(d => new {
        TScore = (new[] {
            d.T15Min, // Let this count .2
            d.T30Min, // .25
            d.T65Min, // .3
            d.T130Min, // .4
            d.T195Min, // .5
            d.TDaily,  // .8
            d.TWeekly // 1
            }).Select((t,i) => confirmingList.Contains(t) ? weights[i] : 0).Sum()
    });

【讨论】:

  • 谢谢你的作品!我在考虑汇总,但 sum 也很有效。
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 2011-06-19
  • 1970-01-01
  • 2020-04-17
  • 2018-05-22
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多