2016-07-04 4 views
0

私のデータベースからのビット値の時間を平均したいと思います。Linqビットの平均(真のパーセンテージ)?

のでbasiclyそれは次のとおりです。

ID 1, Value: True 
ID 2, Value: False 
ID 3, Value: True 

だから私は66%有効時間の平均を持ちたい...

LINQでそれを計算する方法は?

答えて

7

おそらく最短の方法は次のとおりです。

double average = collection.Average(item => item.Value ? 1.0 : 0.0); 
+0

ニース、セレクターが組み込まれたオーバーロードについて忘れてしまいました。 –

+0

@MarcGravell - ありがとうございました。 –

0
static void Main(string[] args) 
{ 
    List<Foo> foos = new List<Foo>(); 
    foos.Add(new Foo() { ID = 1, Value = true }); 
    foos.Add(new Foo() { ID = 2, Value = false }); 
    foos.Add(new Foo() { ID = 3, Value = true }); 

    double Average = (foos.Count(F => F.Value)/Convert.ToDouble(foos.Count)) * 100; 
} 


public class Foo 
{ 
    public int ID { get; set; } 
    public bool Value { get; set; } 
} 
+0

ことを'Convert'のようなものを使うのは危険です。 *動作するかもしれませんが、実際には特定のLINQプロバイダがサポートしているものです。 –

4

それを行うには、多くの方法が、ここでは1です:

var pc = values 
    .Select(v => v.Value ? 1f : 0f) 
    .Average(); 

彼らはうまく掛けし、表示のためにそれらをフォーマットするPを使用するように、1 == 100%となるよう、あなたのパーセント値を保持:

var pc = 2f/3f; 
string.Format("{0:P0}", pc); // 67% 

それとも、永遠に乗じ、LINQで100

+0

質問は* per cent *( '66%')に関するものなので、おそらく '?...? 100f:0f ... ' –

+0

@DmitryBychenkoいいえ、私は、パーセンテージを1 = 100%にすることを強く勧めます。 'string.Format(" {0:P} "、1)=" 100.00% "'これは永久に100を掛けて除算することです。 – weston

+0

; '[0..1]'範囲と最終的な書式設定*は、IMHO、最良の解決策です。 +1 –

2

で割ることでしょうか?以下のようにテストされていないが、おそらく何か:

var percent = source.Select(row => row.Value ? 1.0 : 0.0).Average(); 

はまたCount()Count(x => x.Value)を使用することができますが、それはおそらく、データベースへの2件の旅行だろう。

0

これはあなたがのために平均値を計算しているIEnumerable<bool>持っていることを前提とします。データソースは、おそらくデータベースである場合には、それは、

// Just create some test data. 
IEnumerable<bool> test = Enumerable.Range(0, 12).Select(x => x%3 == 0); 

// Compute the average number of items that are true, as a %. 
var average = 100 * test.Average(x => x ? 1.0 : 0.0);