Перадача дадзеных у хэш-табліцы ў ListBox ў C # з дапамогай «цыкл»

Я ішоў гэтай C# падручніка і высветліў, што яна апісвае толькі перадаваць дадзеныя ў хэш-табліцы ў полі спісу, выкарыстоўваючы Еогеасп цыкла .

Я хачу, каб перадаць дадзеныя ў маёй хэш-табліцы, выкарыстоўваючы для цыклу . Вось мой код да гэтага часу.

    private void button1_Click(object sender, EventArgs e)
    {
        Hashtable students = new Hashtable();

        students.Add("Peter", 67);
        students.Add("Brayan", 76);
        students.Add("Lincoln", 56);
        students.Add("Jack", 65);
        students.Add("Mahone", "no score");
        students.Add("Kevin", 64);

        for (int i = 0; i < students.Count; i++)
        {
            listBox1.Items.Add(students[i]);
        }
    }
}

}

enter image description here

Count method in for loop works in collections. What's the right method for for loop when passing hash table data into a list box.

1
Не выкарыстоўвайце стары Hashtable клас, выкарыстоўвайце замену слоўнік замест гэтага. Тое ж самае дакладна і для (амаль) усіх класаў з System.Collections імёнаў. Іх варта разглядаць састарэлым.
дададзена аўтар Konrad Rudolph, крыніца
@scylla: Ці з'яўляецца ўваходны Няма ацэнкі сапраўдны?
дададзена аўтар jacob aloysious, крыніца

7 адказы

Вы павінны выкарыстоўваць Слоўнік замест HashTable , вы павінны таксама выкарыстоўваць Еогеасп , каб зрабіць рэчы прасцей, то вы можаце зрабіць:

private void button1_Click(object sender, EventArgs e)
{
    Dictionary students = new Dictionary();

    students.Add("Peter", 67);
    students.Add("Brayan", 76);
    students.Add("Lincoln", 56);
    students.Add("Jack", 65);
    students.Add("Mahone", 0);
    students.Add("Kevin", 64);

    foreach (var student in students)
    {
        listBox1.Items.Add(student.Value);
    }
}

<�Моцны> Звярніце ўвагу, я не замяніў "з лікам" з 0 (дзякуй Viper)

5
дададзена
@IlyaIvanov Ды гэта будзе? <�Код> вар гэта дынамічны тып. Яўная тыпізацыя фактычна будзе KeyValuePair
дададзена аўтар mattytommo, крыніца
@IlyaIvanov Няма праблем :)
дададзена аўтар mattytommo, крыніца
@Viper Добры крыку, абнаўляецца :)
дададзена аўтар mattytommo, крыніца
@NominSim Шчыра кажучы, я быў бы схільны пагадзіцца. Я не хачу, каб ўскладніць яго для ОП зараз жа.
дададзена аўтар mattytommo, крыніца
@mattytommo лепшае ўяўленне аб тым, што прыдумаць замест «няма ацэнкі» з нулём будзе мець Значэнне быць тыпу Int і зрабіць гэты запіс нуль.
дададзена аўтар NominSim, крыніца
На жаль, я думаў, ты дзе, выкарыстоўваючы у hashTable як гэта зрабіў OP, упэўнены, што гэта будзе кампіляваць
дададзена аўтар Ilya Ivanov, крыніца
@mattytommo не, гэта не будзе XD не з-за вар але "не ацэнка» не з'яўляецца радком, і ваш Слоўнік <�радок, Int> чакае элемент Int .. але гэта быў код OP
дададзена аўтар Viper, крыніца
Так як усе кажуць мне выкарыстоўваць «для кожнага цыклу» Я мяркую, што ў мяне няма выбару, акрамя як ісці наперад «для кожнага цыклу».
дададзена аўтар scylla, крыніца
Дзякуй! mattytommo. Гэта акуратнае і значна лягчэй зразумець.
дададзена аўтар scylla, крыніца

Калі вы выкарыстоўваеце HashTable, вы не можаце ітэрацыю праз яго з дапамогай індэкса, вы павінны выкарыстоўваць калекцыю Ключы на ​​Hashtable.

foreach(var key in student.Keys){
    listBox1.Items.Add(student[key].ToString());
}

Паколькі хэш састарэлі на карысць слоўніка, вы павінны перапрацаваць сваё рашэнне, каб выкарыстоўваць яго. Аднак, калі па нейкіх прычынах вы не можаце (ці не хочаце), гэта павінна працаваць.

2
дададзена

Вы не маюць доступу да хэш-табліцу з цэлалікавых ключом (калі вы не выкарыстоўвалі Int у якасці ключа ў першую чаргу). Вы павінны выкарыстоўваць ключы, якія вы выкарыстоўвалі, калі вы пабудавалі яго ( радок у вашым выпадку).

На шчасце, вы можаце выкарыстоўваць КЛЮЧЫ ўласцівасць Hashtable і атрымаць ключы ад там.

Але больш пытанне, чаму вы хочаце зрабіць гэта з дапамогай для завесы замест Еогеасп ? Калі ваша праблема ў тым, што вы хочаце мець нейкае лічыльнік даступна, гэта даволі лёгка зрабіць, проста усталяваўшы лічыльнік цыклу і які павялічваецца яго ў пятлі. Нешта накшталт:

int counter = 0;
foreach (var thing in things)
{
    //do something with thing
    counter++;                //this keeps track of how many you've processed.
}
1
дададзена
@scylla: Ну яна магла б працаваць тут, калі цыкл па клавішы калекцыі, а затым выкарыстоўваць кожны ключ, каб атрымаць доступ да Hashtable , але застаецца пытанне, навошта? Вы сказалі, што ў вас ёсць падручнік, які выкарыстоўваецца Еогеасп дык чаму вы хочаце выкарыстоўваць для ?
дададзена аўтар Matt Burland, крыніца
Проста паказаць, то Hashtable можа прымаць што-небудзь у якасці ключа, таму OP вядома, <�я> можна </я> доступ да Hashtable з чымсьці накшталт студэнтаў [0] (яна будзе анулявана ў гэтым выпадку не існуе запіс з гэтым ключом <�я> пакуль )
дададзена аўтар NominSim, крыніца
«Цыкл» працаваў з усім, у тым ліку калекцый і масіваў. Так што першапачаткова я думаў, што гэта будзе працаваць з хэш-табліцы таксама. У любым выпадку я буду рухацца наперад «для кожнага цыклу» хэш-табліцы.
дададзена аўтар scylla, крыніца

Вы не можаце перадаць я цэлы лік у якасці ключа ў вашым Hashtable, таму што вы дадалі радок. Вы павінны перадаць радок значэнне, як мы робім са слоўнікамі, для ўзору:

students["Peter"] //return 67
0
дададзена
Добра, я бачыў, што ён не можа перадаць я цэлы лік у якасці ключа на аснове яго кода, і ў яго кодзе, ён павінен перадаць радок у якасці ключа, таму што ён дадаў, але добра :)
дададзена аўтар Felipe Oriani, крыніца
-1 Гэта няправільна інфарматыўнымі, вы, вядома, можна перадаць цэлы лік у якасці ключа да Hashtable, праблема ў тым, што ён не мае нічога з Int ключы, не кажучы ўжо пра іх, якія адпавядаюць яго для цыклу пераменная. Калі ён перадае Int значэння ў Hashtable індэксацыі вяртае нулявым , як няма запісаў, якія адпавядаюць гэтым ключах.
дададзена аўтар NominSim, крыніца
нават без радка ( «без ачкоў") Visual Studio дае мне тую ж памылку.
дададзена аўтар scylla, крыніца

У Вас ёсць свой цыкл будзе students.count, ня students.count-1.

Адлік гэта ўсяго элементы, і гэта заснавана «масіў» нуль, калі вы - як ужо казалі іншыя, выкарыстоўваць для кожнага аператара, а не, што нашмат акуратней таксама.

0
дададзена

пачынаючы індэкс для «студэнтаў» з'яўляецца 0, як вы пачалі значэнне цыкла ад 0 так, апошняга значэння павінна быць students.Count-1 азначае, што ваш цыкл будзе

 for (int i = 0; i < students.Count-1; i++)
    {
        listBox1.Items.Add(students[i]);
    }
0
дададзена

Іншы спосаб зрабіць гэта:

private void Form1_Load(object sender, EventArgs e)
{
    Hashtable student = new Hashtable();

    student.Add("Peter", 67);
    student.Add("Brayan", 76);
    student.Add("Lincoln", 56);
    student.Add("Jack", 65);
    student.Add("Mahone", "no score");
    student.Add("Kevin", 64);

    ICollection key = student.Keys;
    foreach (string k in key)
    {
        listBox1.Items.Add("Student: " + k + ", Score: " + student[k]);
    }
}
0
дададзена