Приложение C # Dictionary: применение значений посредством выбора ключей - PullRequest
0 голосов
/ 29 января 2009

У меня есть словарь, который я использую для определения номиналов медного кабеля. Я хочу использовать эти значения, чтобы рассчитать, сколько кабелей потребуется, чтобы соответствовать определенному рейтингу соединений. Размер соединения, тип кабеля и тип системы выбираются двумя ComboBox с именами cb_amperage, cb_cable_size и, cb_system_type. Ответ, найденный после выполнения уравнения, должен отображаться в текстовом поле с именем tb6_cable_qty. Я приветствую любые комментарии и предложения. Заранее благодарю за помощь.

Математика проста:

decimal x, y, z;
x = decimal.Parse(cb_amperage.);
y = decimal.Parse();//<---- this value must come from the dictionary below
a = decimal.Parse();//<---- this value must also come from a dictionary below
z = (x / y) * a
tb6_cable_qty.Text = Math.Round(z,2).ToString();


void Cb_amperageSelectedIndexChanged(object sender, EventArgs e)    
    { 
        if (!String.!IsNullOrEmpty(cb_amperage) & !String.IsNullOrEmpty(cb_cable_size))
        //not sure if the above is right but I think it coveys the idea
       {
        //function based on the values in the dictionary below
       }

        //Cable Dictionary 1 used for cable quantity calculation
        Dictionary<string, int> cable_dictionary_1 = new Dictionary<string, int>();

        cable_dictionary_1.Add ("#1", 130);
        cable_dictionary_1.Add ("1/0", 150);
        cable_dictionary_1.Add ("2/0", 175);
        cable_dictionary_1.Add ("3/0", 200);
        cable_dictionary_1.Add ("4/0", 230);
        cable_dictionary_1.Add ("250", 255);
        cable_dictionary_1.Add ("300", 285);
        cable_dictionary_1.Add ("400", 355);
        cable_dictionary_1.Add ("500", 380);
        cable_dictionary_1.Add ("600", 720);
        cable_dictionary_1.Add ("750", 475);


        //System Type Dictionary used for cable quantity calculation
        Dictionary<string, int> system_type_dictionary = new Dictionary<string, int>();

        system_type_dictionary.Add ("3P 3W", 3);
        system_type_dictionary.Add ("3P 4W", 4);

РЕДАКТИРОВАТЬ 1: MMR; пожалуйста, посмотрите на код ниже. У меня такое чувство, что я пропустил что-то, что узнал бы, если бы был немного более опытным. Ниже приведена моя реализация первой части предложенного вами решения. Я получаю ошибку. Я думаю, это потому, что эти два элемента, строка и словарь, не знают, что они должны быть связаны. Здесь ошибка; * Недопустимый токен ',' в объявлении члена класса, структуры или интерфейса (CS1519). Посмотрите, что вы можете увидеть. Еще раз спасибо.

//The following strings are used in the cable quantity calculation
        private const string cblsize1 = "#1";
        private const string cblsize2 = "1/0";
        private const string cblsize3 = "2/0";
        private const string cblsize4 = "3/0";

//Cable Dictionary 1 used for cable quantity calculation
        Dictionary<string, int> cable_dictionary_1 = new Dictionary<string, int>();

        cable_dictionary.Add(cblsize1, 130);//#1 Cable
        cable_dictionary.Add(cblsize2, 150);//1/0 Cable
        cable_dictionary.Add(cblsize3, 175);//2/0 Cable
        cable_dictionary.Add(cblsize4, 200);//3/0 Cable

Ответы [ 3 ]

0 голосов
/ 29 января 2009

Редактировать: Подождите, теперь я получил ваш вопрос!

Вот что я бы сделал:

Сначала для каждого ключа составьте их в виде списка строк, поэтому:

private const string mFirst = "#1";

Затем добавьте в словарь:

mDictionary.Add(mFirst, 130); //etc...

Затем, для каждого поля со списком, добавьте в свои строки

comboBox1.Add(mFirst);
comboBox1.Add(mSecond); //etc...

Затем добавьте событие в поле со списком; выбранный индекс изменен:

comboBox1_SelectedIndexChanged(SomeEventStuff I Forget)

Когда значение там изменится, обновите значение для y. Сделайте то же самое для comboBox2 и обновите значение для z. После обновления любого значения просто обновите результат одновременно.

Редактировать 2:

Для математики у меня была бы функция, которая выглядит следующим образом:

float CopperCalc(float inX, float inY, float inA){
     if (inY != 0){//avoid the division by zero
         return (inX / inY) * inA;
     } else {
         return 0; //just assume it's zero here.
     }//I'm not Jon Skeet, I can't divide by zero
}

Затем вызовите эту функцию в выбранных вами обработанных индексированных обработчиках и используйте ее для обновления вашего текстового поля:

 //put your mX, mY, and mA as member values of your class, and then
 //they get updated.  For instance:
 void comboBox1_SelectedIndexChanged(Events){
     mX = mDictionary[comboBox1.SelectedItem];
     textBox1.Text = CopperCalc(mX, mY, mA).ToString("f1");
 }

И поместите одну и ту же функцию для каждого поля со списком, чтобы поле со списком обновлялось, а затем обновлялось текстовое поле. Этот материал имеет смысл, только если вы хотите попытаться автоматически определить, какой должна быть комбинация проводов:

Это звучит как вариант проблемы с рюкзаком - это правильно? Вам нужно найти какое-то минимальное сочетание медной проводки, чтобы удовлетворить требования к соединениям? Есть ли какое-то минимальное, максимальное или другое ограничение? Почему бы просто не выбросить огромное количество меди, чтобы сделать минимальное требование?

Это очень многословный способ сказать, что мне нужно больше информации, чтобы понять проблему; но, если проблема с ранцем - разумный аналог, то есть решения, но они NP-полны для реализации. То есть они не будут работать «быстро», но если у вас есть только двенадцать проволочных калибров (или что-то еще), вам, вероятно, будет хорошо для скорости.

0 голосов
/ 03 февраля 2009

Решено !!!! Ниже приведен код. Спасибо Rudedog2 форума MSDN C #!

partial class MainForm
{
    double x, y, z;     

    List<string> cable_size1;
    List<string> system_type_list;
    List<string> amperage;

    Dictionary<string, double> cable_dictionary_1;
    Dictionary<string, double> system_type;
    Dictionary<string, double> amperage_dictionary;

private void MainFormLoad(object sender, EventArgs e)
    {
            //Each of the following lists populate the ComboBoxes
            //to be selected on the main form.
            amperage = new List<string>();
            cable_size1 = new List<string>();
            system_type_list = new List<string>();          

            cable_dictionary_1 = new Dictionary<string, double>();
            system_type = new Dictionary<string, double>();
            amperage_dictionary = new Dictionary<string, double>();

            //
            InitializeCurrentLoadCB();
            InitializeCableSizeCB();
            InitializeSystemTypeCB();

            //---------------Dictionaries---------------------------------------------------------
            InitializeSystemTypeLookup();
            InitializeCableLookup();
            InitializeAmperageLookup();
    }
    private void InitializeCurrentLoadCB()
    {
            //Amperage List, No Exclusions-----------------------------------------------------------
            amperage = new List<string>();
            amperage.Add("Please Select Amperage");
            amperage.Add("400");
            amperage.Add("800");
            amperage.Add("1000");
            amperage.Add("1200");
            amperage.Add("1600");
            amperage.Add("2000");
            amperage.Add("2500");
            amperage.Add("3000");
            amperage.Add("3200");
            amperage.Add("4000");
            amperage.Add("5000");
            amperage.Add("6000");

            cb_test_1.DataSource = amperage;
            cb_test_1.SelectedIndex = 0;
            cb_test_1.DropDownStyle = ComboBoxStyle.DropDownList;
    }
    private void InitializeCableSizeCB()
    {
            //Cable List, No Exclusions --------------------------------------------------------------
            cable_size1 = new List<string>();
            cable_size1.Add("Please Select Cable Size");
            cable_size1.Add ("#1");
            cable_size1.Add ("1/0");
            cable_size1.Add ("2/0");
            cable_size1.Add ("3/0");
            cable_size1.Add ("4/0");
            cable_size1.Add ("250");
            cable_size1.Add ("300");
            cable_size1.Add ("400");
            cable_size1.Add ("500");
            cable_size1.Add ("600");
            cable_size1.Add ("700");
            cable_size1.Add ("750");

            cb_test_2.DataSource = cable_size1;
            cb_test_2.SelectedIndex = 0;
            cb_test_2.DropDownStyle = ComboBoxStyle.DropDownList;
            //Initial DataBind for cable size ComboBox
    }
    private void InitializeSystemTypeCB()
    {
            //System Type List  
            system_type_list = new List<string>();
            system_type_list.Add("Select System Type");
            system_type_list.Add("3 Phase 3 Wire");
            system_type_list.Add("3 Phase 4 Wire");

            cb_test_3.DataSource = system_type_list;
            cb_test_3.SelectedIndex = 0;
            cb_test_3.DropDownStyle = ComboBoxStyle.DropDownList;
            //Initial DataBind for cb_system type ComboBox              
    }


    private void Button1Click(object sender, System.EventArgs e)
    {   

        if (!String.IsNullOrEmpty(cb_test_1.Text) &&
           (!String.IsNullOrEmpty(cb_test_2.Text) && 
           (!String.IsNullOrEmpty(cb_test_3.Text))))
            {   
                double a;
                if (cb_test_1.SelectedIndex != 0)
                    {
                        x = amperage_dictionary[amperage[cb_test_1.SelectedIndex]];                 
                    }                                                       

                if (cb_test_2.SelectedIndex != 0)
                    {
                        y = cable_dictionary_1[cable_size1[cb_test_2.SelectedIndex]];                   
                    }   

                if (cb_test_3.SelectedIndex != 0)
                    {
                        z = system_type[system_type_list[cb_test_3.SelectedIndex]];
                    }           

                a = ((x / y)*z);
                this.tb_1.Text = Math.Round(a,2).ToString();

            }

    }
    private void InitializeSystemTypeLookup()
    {
        //System Type Dictionary
        this.system_type = new Dictionary<string, double>();
        this.system_type.Add(this.system_type_list[0], 0);
        this.system_type.Add(this.system_type_list[1], 3);
        this.system_type.Add(this.system_type_list[2], 4);
    }
    private void InitializeCableLookup()
    {
        //Cable Dictionary 1 used for cable quantity calculation
        this.cable_dictionary_1 = new Dictionary<string, double>();
        this.cable_dictionary_1.Add (this.cable_size1[0], 0);
        this.cable_dictionary_1.Add (this.cable_size1[1], 130);
        this.cable_dictionary_1.Add (this.cable_size1[2], 150);
        this.cable_dictionary_1.Add (this.cable_size1[3], 175);
        this.cable_dictionary_1.Add (this.cable_size1[4], 200);
        this.cable_dictionary_1.Add (this.cable_size1[5], 230);
        this.cable_dictionary_1.Add (this.cable_size1[6], 255);
        this.cable_dictionary_1.Add (this.cable_size1[7], 285);
        this.cable_dictionary_1.Add (this.cable_size1[8], 355);
        this.cable_dictionary_1.Add (this.cable_size1[9], 380);
        this.cable_dictionary_1.Add (this.cable_size1[10], 720);
        this.cable_dictionary_1.Add (this.cable_size1[11], 475);
    }
    private void InitializeAmperageLookup()
    {
        //Amperage Dictionary   
        this.amperage_dictionary = new Dictionary<string, double>();
        this.amperage_dictionary.Add(this.amperage[0], 0);
        this.amperage_dictionary.Add(this.amperage[1], 400);
        this.amperage_dictionary.Add(this.amperage[2], 800);
        this.amperage_dictionary.Add(this.amperage[3], 1000);
        this.amperage_dictionary.Add(this.amperage[4], 1200);
        this.amperage_dictionary.Add(this.amperage[5], 1600);
        this.amperage_dictionary.Add(this.amperage[6], 2000);
        this.amperage_dictionary.Add(this.amperage[7], 2500);
        this.amperage_dictionary.Add(this.amperage[8], 3000);
        this.amperage_dictionary.Add(this.amperage[9], 3200);
        this.amperage_dictionary.Add(this.amperage[10], 4000);
        this.amperage_dictionary.Add(this.amperage[11], 5000);
        this.amperage_dictionary.Add(this.amperage[12], 6000);      
    }


}
0 голосов
/ 29 января 2009

Я не уверен, что ваш вопрос? Звучит так, будто ты все это покрыл.

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