WPF датары занимают слишком много памяти - PullRequest
0 голосов
/ 18 октября 2019

WPF Noobie здесь. Я делаю приложение для лотереи, перечислил все комбинации (около 8 миллионов) в таблице данных. Код работает, но он занимает слишком много времени и особенно памяти (около 3 ГБ оперативной памяти).

Проблема заключается в создании новой DataRow. Пытался поставить его перед циклом for и получил ошибку «Row уже к этой таблице». Пытался поместить его в формате и получил ошибку «Он не реализует IDisposable».

Исходя из разработки Android, там у нас есть Recycle View. и нет проблем. Так как я могу решить это эффективно? Должен ли я использовать Dispose, установить null (установка null в строке после того, как я использую его, таблица станет пустой), заранее использовать ObservableCollection?

Thx.

DataTable dtLotoSix = new DataTable();
        dtLotoSix.Columns.Add("Prvi");
        dtLotoSix.Columns.Add("Drugi");
        dtLotoSix.Columns.Add("Treci");
        dtLotoSix.Columns.Add("Cetvrti");
        dtLotoSix.Columns.Add("Peti");
        dtLotoSix.Columns.Add("Sesti");

        int broojkom = 0;

        LOTO6od45 trenutnaKombinacija = new LOTO6od45();


        aktivnaLista = new List<LOTO6od45>();
        for(int i = 1; i < 41; i++)
        {
            for(int j = i + 1; j < 42; j++)
            {
                for (int k = j + 1; k < 43; k++)
                {
                    for (int x = k + 1; x < 44; x++)
                    {
                        for (int y = x + 1; y < 45; y++)
                        {
                            for (int z = y + 1; z < 46; z++)
                            {
                                broojkom++;


                                trenutnaKombinacija.Prvi = i;
                                trenutnaKombinacija.Drugi = j;
                                trenutnaKombinacija.Treci = k;
                                trenutnaKombinacija.Cetvrti = x;
                                trenutnaKombinacija.Peti = y;
                                trenutnaKombinacija.Sesti = z;
                                aktivnaLista.Add(trenutnaKombinacija);

                                DataRow row = dtLotoSix.NewRow(); //THIS TAKES RAM
                                row["Prvi"] = trenutnaKombinacija.Prvi;
                                row["Drugi"] = trenutnaKombinacija.Drugi;
                                row["Treci"] = trenutnaKombinacija.Treci;
                                row["Cetvrti"] = trenutnaKombinacija.Cetvrti;
                                row["Peti"] = trenutnaKombinacija.Peti;
                                row["Sesti"] = trenutnaKombinacija.Sesti;

                                dtLotoSix.Rows.Add(row);

                            }
                        }
                    }
                }
            }
        }

        zaprooovjeru.Text = System.Convert.ToString(broojkom);
        prikazikombinacije.ItemsSource = dtLotoSix.DefaultView;
...