计算可以保持中立的特定数据的平均值

时间:2017-12-12 11:43:34

标签: c# linq average

我已经搜索了平均lambda表达式究竟是如何工作的,但无法找到。

我的问题是:我有一些用不同方式表示的情绪分类。例如,正数句子由数字>表示。它可以是从1到无穷大(1,2,5,100 ......),对于否定句子可以是相同的方式,但用数字< 0表示。比0(-1,-2 .....) - 我知道这不是代表它的更好方式。

我需要计算阳性发生率。我在这里找到SOF问题的每一个答案,如果我将所有数值相加并除以总数,我将找到平均数。没关系。

例如,如果我有11个句子,10个是正值,值= 1,(sum = 10),一个句子为负值,值= -10,我的平均值将是:10-10 / 11 = 0。 / p>

var average = context.CatchDetails.Where(x => x.Monitoring.Client.Id == custmrid
            && x.Data.published >= datai2
            && x.Data.published <= dataf2
            && x.Monitoring.id == monitoring).ToList().Average(y => y.Sentiment);

我正在做的是,取所有正面句子(计数)并除以总句子(计数)。例如:

总数= 11
正数= 10

10/11 = 0.9090,即90,90%的正面事件。

var positive = context.CatchDetails.Count(x => (x.Monitoring.Client.Id == custmrid)
            && x.Data.published >= datai2 && x.Data.published <= dataf2
            && x.Monitoring.id == monitoring
            && x.Sentiment > 0);

var total = context.CatchDetails.Count(x => (x.Monitoring.Client.Id == custmrid)
           && x.Data.published >= datai2 && x.Data.published <= dataf2
           && x.Monitoring.id == monitoring);

double mediaPositive = ((double)positive / (double)total);

有没有更好的可能性呢?

搜索:

How to get words average length using Lambda Expression

Getting an average from a C# array

1 个答案:

答案 0 :(得分:1)

您可以操作从一个LINQ运算符传递到另一个LINQ运算符的数据:

var avg = data.Select(x => x.Sentiment > 0 ? x.Sentiment : 0)
              .Average();

因此,将所有负值视为零。

或者,如果您想忽略某些项目的价值,但仍然将其包括在计数中,则您需要自己进行平均计算。

var count = data.Count();
var total = data.Select(x => x.Sentiment > 0).Sum(x => x.Sentiment);
// Avoid divide by zero if no data...
var avg = count > 0 ? total/count : defaultValue;

但是,您似乎只想要两个不同的计数:

var totalCount = data.Count();
var positiveCount = data.Select(x => x.Sentiment > 0).Count();
// Ignore totalCount == 0! But force floating point calc.
var res = (double)positiveCount / totalCount;