c# - 从多个对象中获取最大值、最小值和平均值的最快、最简单的方法

标签 c# list observablecollection

我需要找到具有自己统计信息(ResultGroup 类统计信息,基于所有结果统计信息)的对象列表的最大值、最小值和平均值(统计信息)。 当我添加对象时,值很容易更新,但如果我更改或删除其中一个,那么我需要再次查找统计信息。通常会有 40.000 多个项目,我需要它是一个快速操作。

有没有比遍历所有项目更好的方法?

public class ResultGroup
{
    private Stats resultStats;
    //I need an updated stats
    public Stats ResultStats
    {
        get { return resultStats; }
    }
    private readonly ObservableCollection<Result> results = new ObservableCollection<Result>();

    public ObservableCollection<Result> Results
    {
        get
        {
            return results;
        }
    }
    public ResultGroup()
    {
        this.resultStats = new Stats();
        this.results.CollectionChanged += new NotifyCollectionChangedEventHandler(CollectionChanged);
    }

    private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            //It works ok on add.
            Stats lastResultStat = this.results[this.results.Count - 1].Stat;
            if (resultStats.Max < lastResultStat.Max)
                resultStats.Max = lastResultStat.Max;

            if (resultStats.Min > lastResultStat.Min)
                resultStats.Min = lastResultStat.Min;

            resultStats.Mean = (resultStats.Mean * (this.results.Count - 1) + lastResultStat.Mean) / this.results.Count;
        }
        else if (e.Action == NotifyCollectionChangedAction.Reset)
        {
            this.resultStats = StatsFactory();
        }
        else if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            //Need to find the stats here
        }
        else if (e.Action == NotifyCollectionChangedAction.Replace)
        {
            //Need to find the stats here
        }
    }

    private Stats StatsFactory()
    {
        Stats dataStats = new Stats();
        dataStats.Max = float.MinValue;
        dataStats.Min = float.MaxValue;
        dataStats.Mean = 0;
        return dataStats;
    }
}

public class Result
{
    private float[] data;

    //Another class will fill data and set the Stats (max, min, mean)
    public float[] Data
    {
        get { return data; }
    }

    public Result(int lenght)
    {
        this.data = new float[lenght];
    }

    private Stats stat;
    public Stats Stat
    {
        get { return stat; }
        set { stat = value; }
    }
}

public class Stats
{
    public float Max { get; set; }
    public float Min { get; set; }
    public float Mean { get; set; }
}

最佳答案

当删除一个项目时,你只需要循环遍历所有项目,当删除的项目等于当前的最小值/最大值时。

当替换一个项目时,你只需要循环遍历所有项目,当删除的项目等于当前的最小值/最大值并且新的项目更大/更小。

关于c# - 从多个对象中获取最大值、最小值和平均值的最快、最简单的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600806/

相关文章:

c# - getter 和 setter 的主要区别是什么?

c# - mysql存储过程批量插入

java - 为不可修改的列表实现迭代器

绑定(bind)到在单独线程上更新的 ObservableCollection 的 WPF DataGrid 无法维护排序

javascript - asp.net 中的 500 内部服务器错误

c# - 来自模态对话框的模态对话框 - 当第二个关闭时都关闭 - 为什么?

list - 整数列表中最长子序列的长度

python - 使用多处理从不同进程附加到同一个列表

WPF Observablecollection主细节场景

c# - WPF DataGrid 正在添加额外的 "ghost"行