Професионална програма
Loading...
+ Нов въпрос
RoYaL avatar RoYaL Trainer 6845 Точки
Best Answer

А какви очакваш да са стойностите? Дай примерен изход на масива, който очакваш да излезе

[0,0,0] = 15,

[0,1,0] = 25,

и т.н.?

Дай с малко числа, за да стане ясно?

0
simeon10 avatar simeon10 218 Точки

Всички елементи са стрингове. Ето част от текстовия файл:

USA
Tier 1
F2A-1 Buffalo.png
F2A-3 Buffalo.png
OS2U-1 Kingfisher.png
OS2U-3 Kingfisher.png
P-26A-33 Peashooter.png
P-26A-34 M2 Peashooter.png
P-26A-34 Peashooter.png
P-26B-35 Peashooter.png
P-36A Hawk.png
P-36C Hawk.png
P-36G Hawk.png
PBY-5 Catalina.png
PBY-5a Catalina.png
Rasmussen's P-36A Hawk.png
SBD-3 Dauntless.png
Tier 2
A-20G-25 Havoc.png
A-36 Apache.png

...

Всеки път като срещне име на държава, както в случая USA, x трябва да се увеличи с 1, а всеки път като срещне
Tier N, y се увеличава с 1. Всеки друг ред, който е различен от име на държава и Tier N, трябва да се запише в третото измерение. В този случай между Tier 1 и Tier 2 имаме 15 реда, но между 2 и 3 може да са 25/5/20 или каквото и да било друго число.

0
RoYaL avatar RoYaL Trainer 6845 Точки

Разбрах те:

n["USA", "Tier1"] = ["f2a-1", "f2a-3", ...]

n["USA", Tier"2"] = ["...", "...", ...]

n["Canada", "Tier1"] = [ ... ]

Нали така? Където Канада и УСА са х, а Тайърите у (числа)

Защо не направиш двумерен масив от листове от стрингове? При положение, че не знаеш колко неща ще имаш в Tier-ите, масив е най-неподходящата структура. Единият вариант е първо да обиклоиш файла за да видиш колко ще ти е голямо третото измерение всеки път, което е крайно неефективно. Другия варинат е да ползваш структура от данни, която позволява нефиксиран брой елементи.

Нещо такова:

            List<string>[][] x = new List<string>[10][];

            //USA
            x[0] = new List<string>[2];

            //USA tier1
            x[0][0] = new List<string>();
            x[0][0].Add("f2a-1");
            x[0][0].Add("f2a-3");

            //USA tier2
            x[0][1] = new List<string>();
            x[0][1].Add("smth-else");

            //Canada
            x[1] = new List<string>[1];

            //Canada tier1
            x[1][0] = new List<string>();
            x[1][0].Add("smth-for-tier1-canada");

Въпреки, че ми се струва, че твоята структура най-добре отговаря на речник

dicitonary["USA"] =>

      ["Tier1"] => [....],

     ["Tier2"] => [ ... ],

което е Dictionary<string, Dictionary<string, List<string>>>

1
simeon10 avatar simeon10 218 Точки
List&lt;string&gt; lines = new List&lt;string&gt;();
            string[,,] allAir = new string[5, 5, 35];
            List &lt;string&gt; resultArr = new List&lt;string&gt;();
            int x = -1, y = -1, z = 0;
            cbArrCountry = new CheckBox[] { chboxAmerica, chboxGermany, chboxUssr, chboxBritain, chboxJapan };
            cbArrTier = new CheckBox[] { chboxTier1, chboxTier2, chboxTier3, chboxTier4, chboxTier5 };

            try
            {
                using (StreamReader sr = new StreamReader("Aviation.txt"))
                {
                    String line;

                    while ((line = sr.ReadLine()) != null)
                    {
                        lines.Add(line);
                    }
                }
            }
            catch (Exception o)
            {
                lblResult.Content = "Weird error has occured. Send this message to the author -&gt; " + o.Message;
            }
            foreach (string line in lines)
            {
                if (line.Equals("USA") || line.Equals("Germany") || line.Equals("USSR") || line.Equals("Britain") || line.Equals("Japan"))
                {
                    x++;
                    y = -1;
                    continue;
                }
                else if (line.Contains("Tier 1") || line.Contains("Tier 2") || line.Contains("Tier 3") || line.Contains("Tier 4") || line.Contains("Tier 5"))
                {
                    y++;
                    z = 0;
                }
                else
                {
                    allAir[x, y, z] = line;
                    z++;
                }
            }

            for (int i = 0; i &lt; 5; i++)
            {
                for (int j = 0; j &lt; 5; j++)
                {
                    for (int k = 0; k &lt; 35; k++)
                    {
                        if(cbArrCountry[i].IsChecked.HasValue &amp;&amp; cbArrCountry[i].IsChecked.Value == true &amp;&amp; cbArrCountry[i].IsEnabled == true)
                        {
                            if (cbArrTier[j].IsChecked.HasValue &amp;&amp; cbArrTier[j].IsChecked.Value == true &amp;&amp; cbArrTier[i].IsEnabled == true)
                            {
                                if(allAir[i, j, k] != null)
                                {
                                    resultArr.Add(allAir[i, j, k]);
                                }
                                else
                                {
                                    break;
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
            if(resultArr.Count != 0)
            {
                Random rand = new Random();
                int randNum = (int)rand.Next(0, resultArr.Count);

                var uri = new Uri("pack://application:,,,/Images/" + resultArr[randNum]);
                imgResult.Source = new BitmapImage(uri);
                int fileExtPos = resultArr[randNum].LastIndexOf(".");

                if (fileExtPos &gt;= 0)
                {
                    resultArr[randNum] = resultArr[randNum].Substring(0, fileExtPos);
                }
                lblResult.Content = resultArr[randNum];
            }
            else
            {
                MessageBox.Show("Please choose at least one country and tier");
            }

В момента кода представлява това и работи без грешка, но следобяд, като имам малко време ще го преработя с List<>, защото наистина е много по-ефективно, и нямам идея защо не се сетих сам. Мерси много. :)

0