0

HardwarePerformanceという名前のクラスに次のフィールドが含まれています:time、cpuUsagePercent、memoryUsagePercent、diskUsage、diskRead、diskWrite、latency。統計データではないデータを含めるためにListオブジェクトを埋めていました。Linqコマンドでこれらすべてのフィールドの平均値を計算する必要があります。Linqで平均値を取得する方法がわかりません。以下は私が書いたコードです(もちろん間違っています)。

var _hardwarePerf = (from _stats in _statsList 
                    where _time>=DateTime.Parse("2012-04-04 00:00:00")
                        &&_time<=DateTime.Parse("2012-04-04 11:00:00") 
                    select new {
                           Latency = _stats.latency, 
                           CpuUsagePercent = _stats.cpuUsagePercent, 
                           MemoryUsagePercent = _stats.memoryUsagePercent, 
                           DiskUsage = _stats.diskUsage, DiskRead = _stats.diskRead, 
                           DiskWrite = _stats.diskWrite
                    }).Average(Latency => Latency.Latency);

このコードの構文は正しいです。しかし、すべての平均値を同時に計算したいのですが、コードを作成するにはどうすればよいですか?

4

4 に答える 4

1

LINQには、このための組み込みメソッドはありません。コレクションを数回繰り返すことを気にせず、匿名オブジェクトで問題がないと仮定すると、次のように実行できます(filteredStats平均化するデータが含まれ、おそらく時間でフィルタリングされます)。

var averages =
    new
    {
        Latency = filteredStats.Average(x => x.Latency),
        CpuUsagePercent = filteredStats.Average(x => x.CpuUsagePercent),
        …
    };

それがあなたが望むものでない場合、あなたはおそらくあなた自身で平均を計算しなければならないでしょう。

于 2012-04-19T07:22:57.127 に答える
0

次の例では、1 回の繰り返しですべての平均を計算していますが、これは多くのコードです。

timeは統計オブジェクトのプロパティであると想定していることに注意してください。それ以外の場合select where timeはあまり意味がありません。

var _hardwareAccumulator =
    _statsList
        .Where(s =>
            s.time >= DateTime.Parse("2012-04-04 00:00:00") &&
            s.time <= DateTime.Parse("2012-04-04 11:00:00"))
        .Aggregate(
            new
            {
                count = 0,
                cpuUsagePercent = 0.0,
                memoryUsagePercent = 0.0,
                diskUsage = 0.0,
                diskRead = 0.0
            },
            (acc, s) =>
                new
                {
                    count = acc.count + 1,
                    cpuUsagePercent =
                        acc.cpuUsagePercent + s.cpuUsagePercent,
                    memoryUsagePercent =
                        acc.memoryUsagePercent + s.memoryUsagePercent,
                    diskUsage =
                        acc.diskUsage + s.diskUsage,
                    diskRead =
                        acc.diskRead + s.diskRead
                }
            );
var _hardwarePerf = new
{
    cpuUsagePercent =
        _hardwareAccumulator.cpuUsagePercent / _hardwareAccumulator.count,
    memoryUsagePercent =
        _hardwareAccumulator.memoryUsagePercent / _hardwareAccumulator.count,
    diskUsage =
        _hardwareAccumulator.diskUsage / _hardwareAccumulator.count,
    diskRead =
        _hardwareAccumulator.diskRead / _hardwareAccumulator.count
};
于 2012-04-19T07:32:56.450 に答える
0

別のステートメントでそれを行う必要があるか、次のあまり直感的ではない方法で行うことができます。

var averages = statsList.Where(s => s.time >= new DateTime(2012, 4, 4) && s.time <= new DateTime(2012, 4, 04, 11, 0, 0))
            .GroupBy(s => 1)
            .Select(grp => new
            {
                Latency = grp.Average(s => s.latency),
                CpuUsagePercent = grp.Average(s => s.cpuUsagePercent),
                MemoryUsagePercent = grp.Average(s => s.memoryUsagePercent),
                DiskUsage = grp.Average(s => s.diskUsage),
                DiskRead = grp.Average(s => s.diskRead),
                DiskWrite = grp.Average(s => s.diskWrite)
            }).FirstOrDefault();

.GroupBy(s => 1)各プロパティの平均を計算できるようにするためだけに注意してください。また、プロパティ名から下線を削除し、クラスに時間を追加したことにも注意してください。

他のアプローチは読みやすいです:

var theStats = statsList.Where(s => s.time >= new DateTime(2012, 4, 4) && s.time <= new DateTime(2012, 4, 04, 11, 0, 0));
var Latency = theStats.Average(s => s.latency);
var CpuUsagePercent = theStats.Average(s => s.cpuUsagePercent);
// ....
于 2012-04-19T07:33:30.923 に答える
-2

「GroupBy」を使用してから、平均予測を使用して計算できます。

var query = from _stats in _statsList 
    group _stats by new {
               Latency = _stats.latency, 
               CpuUsagePercent = _stats.cpuUsagePercent, 
               MemoryUsagePercent = _stats.memoryUsagePercent, 
               DiskUsage = _stats.diskUsage, 
               DiskRead = _stats.diskRead, 
               DiskWrite = _stats.diskWrite

    } into myGroup
    select new {
        AverageVal = myGroup.Average(x => x.Value),
        CpuUsagePercent = myGroup.Key.CpuUsagePercent,
        ... // the rest of your projection
};

LINQ平均

于 2012-04-19T07:22:17.663 に答える