سؤال

تسمح شبكة DevExpress (XtraGrid) للشبكات ومجموعاتها بإجراء حسابات موجزة.الخيارات المتاحة هي Count وMax وMin وAvg وSum وNone وCustom.

هل حصل أي شخص على بعض نماذج التعليمات البرمجية التي توضح كيفية حساب عمود المتوسط ​​المرجح، بناءً على الأوزان المقدمة كقيم في عمود آخر؟

هل كانت مفيدة؟

المحلول

لقد انتهيت من حل هذه المشكلة، وسأقوم بنشر الحل هنا في حال وجده الآخرون مفيدًا.

إذا كان المتوسط ​​المرجح يتكون من قيمة ووزن لكل صف، فيجب أن يحتوي العمود الذي يحتوي على القيمة على كائن الوزن GridColumn المعين لخاصية Tag الخاصة به.بعد ذلك، سيقوم معالج الحدث بالباقي:

private static void gridView_CustomSummaryCalculate(object sender, CustomSummaryEventArgs e)
{
    GridColumn weightColumn = ((GridSummaryItem)e.Item).Tag as GridColumn;

    if (weightColumn == null)
        return;

    switch (e.SummaryProcess)
    {
        case CustomSummaryProcess.Start:
        {
            e.TotalValue = new WeightedAverageCalculator();
            break;
        }
        case CustomSummaryProcess.Calculate:
        {
            double size = Convert.ToDouble(e.FieldValue);
            double weight = Convert.ToDouble(((GridView)sender).GetRowCellValue(e.RowHandle, weightColumn));

            ((WeightedAverageCalculator)e.TotalValue).Add(weight, size);
            break;
        }
        case CustomSummaryProcess.Finalize:
        {
            e.TotalValue = ((WeightedAverageCalculator)e.TotalValue).Value;
            break;
        }
    }
}

private sealed class WeightedAverageCalculator
{
    private double _sumOfProducts;
    private double _totalWeight;

    public void Add(double weight, double size)
    {
        _sumOfProducts += weight * size;
        _totalWeight += weight;
    }

    public double Value
    {
        get { return _totalWeight==0 ? 0 : _sumOfProducts / _totalWeight; }
    }
}

يفترض الكود أنه يمكن تحويل قيم الأعمدة الأساسية إلى قيم مزدوجة عبر Convert.ToDouble(object).

نصائح أخرى

إذا قمت بتوفير تعبير لامدا الخاص بك داخل المجموع، فيجب أن تكون قادرًا على تجميعها حسب مجموع قياسي.وأعتقد أن هذا يجب أن تعمل:

var grouped = from item in items
orderby item.Group
group item by item.Group into grp
select new
{
Average= grp.Sum(row => row.Value * row.Weight)
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top