Есть ли другие способы написать компактную логику вместо той, которая представлена ​​здесь в C #, используя foreach, list или dictionary? - PullRequest
0 голосов
/ 04 февраля 2011

Привет Вот логика, которую я хотел бы переписать в очень компактной версии. Я знаю, что это возможно, но я в замешательстве, поэтому я предоставляю всю логику в очень сырой расширенной версии.

{
    //unitOfDisplay = "MB";
    keyValuePair.Value.MonthlyInfo[TOTAL].RowHeader = "Total MB";

    if (keyValuePair.Value.MonthlyInfo[UNIT].Month1 != "-" && keyValuePair.Value.MonthlyInfo[UNIT].Month1 != toUOM.ToString())
    {
        string fromunit = keyValuePair.Value.MonthlyInfo[UNIT].Month1;
        //Call converter method
        double outdata;
        if (keyValuePair.Value.MonthlyInfo[TOTAL].Month1 != "-" && !(keyValuePair.Value.MonthlyInfo[TOTAL].Month1.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[TOTAL].Month1, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[TOTAL].Month1 = outdata.ToString("#,###,###.##");
        }                                             
        if (keyValuePair.Value.MonthlyInfo[INCLUDED].Month1 != "-" && !(keyValuePair.Value.MonthlyInfo[INCLUDED].Month1.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[INCLUDED].Month1, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[INCLUDED].Month1 = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[BILLED].Month1 != "-" && !(keyValuePair.Value.MonthlyInfo[BILLED].Month1.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[BILLED].Month1, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[BILLED].Month1 = outdata.ToString("#,###,###.##");
        }
    }
    if (keyValuePair.Value.MonthlyInfo[UNIT].Month2 != "-" && keyValuePair.Value.MonthlyInfo[UNIT].Month2 != toUOM.ToString())
    {
        string fromunit = keyValuePair.Value.MonthlyInfo[UNIT].Month2;
        //Call converter method.
        double outdata;
        if (keyValuePair.Value.MonthlyInfo[TOTAL].Month2 != "-" && !(keyValuePair.Value.MonthlyInfo[TOTAL].Month2.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[TOTAL].Month2, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[TOTAL].Month2 = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[INCLUDED].Month2 != "-" && !(keyValuePair.Value.MonthlyInfo[INCLUDED].Month2.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[INCLUDED].Month2, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[INCLUDED].Month2 = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[BILLED].Month2 != "-" && !(keyValuePair.Value.MonthlyInfo[BILLED].Month2.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[BILLED].Month2, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[BILLED].Month2 = outdata.ToString("#,###,###.##");
        }
    }
    if (keyValuePair.Value.MonthlyInfo[UNIT].Month3 != "-" && keyValuePair.Value.MonthlyInfo[UNIT].Month3 != toUOM.ToString())
    {
        string fromunit = keyValuePair.Value.MonthlyInfo[UNIT].Month3;
        //Call converter method.
        double outdata;
        if (keyValuePair.Value.MonthlyInfo[TOTAL].Month3 != "-" && !(keyValuePair.Value.MonthlyInfo[TOTAL].Month3.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[TOTAL].Month3, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[TOTAL].Month3 = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[INCLUDED].Month3 != "-" && !(keyValuePair.Value.MonthlyInfo[INCLUDED].Month3.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[INCLUDED].Month3, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[INCLUDED].Month3 = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[BILLED].Month3 != "-" && !(keyValuePair.Value.MonthlyInfo[BILLED].Month3.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[BILLED].Month3, fromunit, toUOM.ToString(), out outdata);
        keyValuePair.Value.MonthlyInfo[BILLED].Month3 = outdata.ToString("#,###,###.##");
        }
    }
    if (keyValuePair.Value.MonthlyInfo[UNIT].Average != "-" && keyValuePair.Value.MonthlyInfo[UNIT].Average != toUOM.ToString())
    {
        string fromunit = keyValuePair.Value.MonthlyInfo[UNIT].Average;
        //Call converter method.
        double outdata;
        if (keyValuePair.Value.MonthlyInfo[TOTAL].Average != "-" && !(keyValuePair.Value.MonthlyInfo[TOTAL].Average.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[TOTAL].Average, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[TOTAL].Average = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[INCLUDED].Average != "-" && !(keyValuePair.Value.MonthlyInfo[INCLUDED].Average.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[INCLUDED].Average, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[INCLUDED].Average = outdata.ToString("#,###,###.##");
        }
        if (keyValuePair.Value.MonthlyInfo[BILLED].Average != "-" && !(keyValuePair.Value.MonthlyInfo[BILLED].Average.ToString().Equals("0.00")))
        {
            ConvertDataUnit(keyValuePair.Value.MonthlyInfo[BILLED].Average, fromunit, toUOM.ToString(), out outdata);
            keyValuePair.Value.MonthlyInfo[BILLED].Average = outdata.ToString("#,###,###.##");
        }
    }
}

Этот случай только для случаев, когда единица отображения указана в МБ, логика преобразует значение для общей суммы месяца, выставленной в счет и включенной и усредненной из соответствующих единиц (которые могут быть в МБ, КБ или ГБ) в 'МБ «

Затем мне нужно написать еще 2 похожих случая, когда единица измерения равна 1. «ГБ» и 2. «КБ»

Мне нужна помощь, чтобы написать компактную логику для этих данных.

Спасибо Kris!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2011

Factorize!

Это может быть так

public void CheckGlobal()
{
    Test(toUOM, keyValuePair.Value.MonthlyInfo, mi => mi.Month1, (mi, val) => mi.Month1 = val);
    Test(toUOM, keyValuePair.Value.MonthlyInfo, mi => mi.Month2, (mi, val) => mi.Month2 = val);
    Test(toUOM, keyValuePair.Value.MonthlyInfo, mi => mi.Month3, (mi, val) => mi.Month3 = val);
    Test(toUOM, keyValuePair.Value.MonthlyInfo, mi => mi.Average, (mi, val) => mi.Average = val);
}

private void CheckProperty(string toUOM, MonthlyInfoArray monthlyInfoArray, Func<MonthlyInfo, string> getValue, Action<MonthlyInfo, string> setValue)
{
    var fromunit = getValue(monthlyInfoArray[UNIT]);
    if (unit != "-" && unit != toUOM.ToString())
    {
        string outdata;
        if (CheckBasic(fromunit, toUOM, getValue(monthlyInfoArray[TOTAL]), out outdata))
        {
            setValue(monthlyInfoArray[TOTAL], outdata);
        }
        if (CheckBasic(fromunit, toUOM, getValue(monthlyInfoArray[INCLUDED]), out outdata))
        {
            setValue(monthlyInfoArray[INCLUDED], outdata);
        }
        if (CheckBasic(fromunit, toUOM, getValue(monthlyInfoArray[BILLED]), out outdata))
        {
            setValue(monthlyInfoArray[BILLED], outdata);
        }
    }
}

private bool CheckBasic(string formunit, string toUOM, string value, out string sOutdata)
{
    if (value != "-" && !(value.ToString().Equals("0.00")))
    {
        double dOutdata;
        ConvertDataUnit(value, fromunit, toUOM.ToString(), out dOutdata);
        sOutdata=dOutdata.ToString("#,###,###.##");
        return true;
    }
    else
    {
        return false;
    }
}

Вы получите время и размер приложения;)

0 голосов
/ 04 февраля 2011

Да, здесь тонна дублирования.Я не думаю, что LINQ поможет, но вы определенно можете сделать это намного проще.

Начните с взятия базовой единицы повторяющегося кода и превращения ее в вспомогательную функцию.Задание ВСЕГО / ВКЛЮЧЕНО / БИЛЛЕТД параметра должно быть простым.Чтобы сделать Month1 / Month2 / Month3 / Average параметром, потребуются некоторые хитрости, такие как использование лямбда-выражения для выбора какого-либо свойства.

РЕДАКТИРОВАТЬ: Но на самом деле, я думаю, что наилучшим решением является выбор одной единицы для внутренних переменных (напримеркБ) и прекратить все это преобразование назад и вперед.Сделайте только одно преобразование, чтобы создать строку для отображения.Преобразование назад и вперед потеряет точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...