私のデータベースからのビット値の時間を平均したいと思います。Linqビットの平均(真のパーセンテージ)?
のでbasiclyそれは次のとおりです。
ID 1, Value: True
ID 2, Value: False
ID 3, Value: True
だから私は66%有効時間の平均を持ちたい...
LINQでそれを計算する方法は?
私のデータベースからのビット値の時間を平均したいと思います。Linqビットの平均(真のパーセンテージ)?
のでbasiclyそれは次のとおりです。
ID 1, Value: True
ID 2, Value: False
ID 3, Value: True
だから私は66%有効時間の平均を持ちたい...
LINQでそれを計算する方法は?
おそらく最短の方法は次のとおりです。
double average = collection.Average(item => item.Value ? 1.0 : 0.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; }
}
ことを'Convert'のようなものを使うのは危険です。 *動作するかもしれませんが、実際には特定のLINQプロバイダがサポートしているものです。 –
それを行うには、多くの方法が、ここでは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
質問は* per cent *( '66%')に関するものなので、おそらく '?...? 100f:0f ... ' –
@DmitryBychenkoいいえ、私は、パーセンテージを1 = 100%にすることを強く勧めます。 'string.Format(" {0:P} "、1)=" 100.00% "'これは永久に100を掛けて除算することです。 – weston
; '[0..1]'範囲と最終的な書式設定*は、IMHO、最良の解決策です。 +1 –
で割ることでしょうか?以下のようにテストされていないが、おそらく何か:
var percent = source.Select(row => row.Value ? 1.0 : 0.0).Average();
はまたCount()
とCount(x => x.Value)
を使用することができますが、それはおそらく、データベースへの2件の旅行だろう。
これはあなたがのために平均値を計算している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);
ニース、セレクターが組み込まれたオーバーロードについて忘れてしまいました。 –
@MarcGravell - ありがとうございました。 –