Saya telah mencari tentang bagaimana ekspresi lambda rata-rata bekerja, tetapi tidak dapat menemukannya.

Masalah saya adalah: Saya memiliki beberapa klasifikasi sentimen yang diwakili oleh cara yang berbeda. Misalnya, kalimat positif dilambangkan dengan angka > dari 0. Bisa dari 1 hingga tak terhingga (1, 2, 5, 100....) dan untuk kalimat negatif caranya sama, tetapi dilambangkan dengan angka < dari 0 (-1, -2.....) - Saya tahu itu bukan cara yang lebih baik untuk mewakili itu.

Dan saya perlu menghitung rata-rata kejadian positif. Setiap jawaban dari pertanyaan pada SOF yang saya temukan di sini, jika saya menjumlahkan semua nilai dan membaginya dengan jumlah total saya akan menemukan rata-ratanya. Tidak apa-apa.

Misalnya, jika saya memiliki 11 kalimat dan 10 positif dengan nilai = 1, (jumlah = 10) dan satu kalimat negatif dengan nilai = -10 rata-rata saya akan menjadi: 10-10/ 11 = 0.

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);

Yang saya lakukan adalah, mengambil semua kalimat positif (count) dan membaginya dengan total kalimat (count). Contoh:

Jumlah total = 11
hitungan positif = 10

10/11 = 0.9090 yaitu 90,90% kejadian positif.

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);

Apakah ada kemungkinan yang lebih baik untuk melakukan itu?

Penelusuran:

Cara mendapatkan panjang rata-rata kata menggunakan Ekspresi Lambda

Mendapatkan rata-rata dari array C#

1
Daniel Nicolay 12 Desember 2017, 14:43

1 menjawab

Jawaban Terbaik

Anda dapat memanipulasi data yang dikirimkan dari satu operator LINQ ke operator lain:

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

Jadi perlakukan semua nilai negatif sebagai nol.

Sebagai alternatif, jika Anda ingin mengabaikan nilai beberapa item, tetapi tetap memasukkannya ke dalam hitungan, Anda harus melakukan perhitungan rata-rata sendiri.

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;

Namun, Anda sepertinya hanya menginginkan dua hitungan yang berbeda:

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;
1
Camilo Terevinto 12 Desember 2017, 11:58