[C#] tablice postrzępione - w ogóle tablice...

0

Witam.
Początkujący ze mnie Csharp-owiec więc proszę o wyrozumiałość jeśli problem jest banalny...
Przede wszystkim chodzi o to czy zawsze muszę podać wymiar tablicy?

Zadeklarowałem metodę, która w założeniu ma zwracać tablicę

string[][]

w której mam nazwy katalogów spełniających dany warunek i nazwy plików w tym katalogu także spełniające dany warunek, czyli np.:

myFileArray[0] = {dir1, file1, file2, file3};
myFileArray[1] = {dir2, file4, file5};
myFileArray[2] = {dir3, file6, file7, file8, file9};

...ale przed sprawdzeniem nie wiem ile jest tych katalogów i plików w nich zawartych.

Pobieram listę podkatalogów z jakiegoś tam katalogu bazowego:

string[] listaKat = Directory.GetDirectories(sciezka);

Przy pomocy wyrażeń regularnych i

foreach

sprawdzam ile katalogów spełnia warunek więc mam wymiar tablicy głównej bo przecież muszę znać jej wymiar żeby ją zadeklarować.
No i wychodzi mi na to, że znowu muszę wywołać

foreach

żeby przypisać odpowiednie wartości...

Czy jedynym rozwiązaniem jest deklaracja wymiaru tablicy na wyrost? Jakieś to dla mnie nie ten tego...
A może "coś" zamiast tablicy (struktura, klasa...)?

Zapętliłem się na maksa. Może chodzi o godzinę już nieludzką ;)
Proszę o jakieś sugestie...

Pozdrawiam

0

Stosując podczas deklaracji składnię z klamrami, nie trzeba podawać rozmiaru tablicy.

string[] stringArray = {"raz", "dwa", "trzy"} 
0

"lista" załatwiła sprawę - dzięki, somekind - kilku rzeczy się nauczyłem.
AdamPL również dzięki za zaangażowanie, ale chyba nie do końca złapałeś o co mi kaman...

Podrzucę później moje rozwiązanie - może kiedyś, komuś takiemu jak ja się przyda.

Jednak jakiś taki niedosyt pozostaje - zastanawiam się czy nie można by było spreparować jakiegoś własnego typu tablicowego, który nie wymagałby podania wymiaru tablicy.
Za wysokie progi na razie...

Pozdrawiam

0
pastefqa napisał(a)

Jednak jakiś taki niedosyt pozostaje - zastanawiam się czy nie można by było spreparować jakiegoś własnego typu tablicowego, który nie wymagałby podania wymiaru tablicy.

No to to jest właśnie List. Oczywiście możesz postarać się o własną implementację. Może nawet udałoby Ci się zrobić lepszą niż ta wbudowana. :)

0

No i właśnie o tym myślałem kiedy mówiłem "niedosyt" - nie pasuje mi przede wszystkim konieczność "wymiarowania" tablicy.
Że już nie wspomnę o tym samym typie danych dla wszystkich składowych. Choć z drugiej strony, jest

Convert

Ale czy nie byłoby fajnie nie pamiętać o tym i mieć np. taką tablicę:

myArray[0] = {string, int, int, int};
myArray[1] = {string, int, int};
myArray[2] = {string, int, int, int, int};

bo właśnie coś takiego chciałem uzyskać na początku (okazało się to błędnym podejściem).

A poniżej mój przykład - proszę o ewentualne uwagi.

Założenie jest takie:
Kiedy jestem zmuszony wstać od kompa bo browar i fajki się skończyły, wychodzę do sklepu. A, że jestem zajebistym farciarzem po drodze spotykam wiele babeczek, którym robię zdjęcia. Każda, która z 50ciu metrów ode mnie, nie omija mnie szerokim łukiem to "niunia". Reszta - "brzydula".
Wracam do kompa i zapisuję w katalogu o nazwie dd.MM wszystkie fotki z danego dnia (dd) w miesiącu (MM): niunia_HH.mm.jpg, brzydula_HH.mm.jpg (gdzie HH to godzina a mm to minuty).
Do tego w danym miesiącu mogłem zrobić kilka innych fotek tematycznych nie przypisanych do konkretnego dnia, ale do tematu, więc są też inne katalogi: Porsche, DogShit, RozbityBrowar...
Piwka sporo więc chcę zrobić zestawienie miesięczne kiedy to mi się skończyły zapasy (dzień, w którym musiałem wyjść) i tych babeczek co mnie nie omijają bo przecież nie pamiętam co się działo w przeciągu całego miesiąca. A do tego uparłem się żeby wynik był typu array:

private string[][] zliczNiunie(string katalogMiesieczny)
        {
            //Inicjuj potrzebne zmienne
            DirectoryInfo dir;
            FileInfo file;
            List<string> listaNazwKat = new List<string>();

            //pobierz listę wszystkich podkatalogów z katalogu miesięcznego
            string[] listaKat = Directory.GetDirectories(katalogMiesieczny);

            //wzorzec dla podkatalogów
            string sKatDzien = "^\\d{2}.\\d{2}$";   //nazwy podkatalogów w formie "dd.MM"
                                                    //czyli np.: "01.11" = 1. listopada

            //policz katalogi pasujące do wzorca
            foreach (string kat in listaKat)
            {
                //pobierz info o bieżącym katalogu
                dir = new DirectoryInfo(kat);
                //jeżeli nazwa podkatalogu pasuje do wzorca...
                if (System.Text.RegularExpressions.Regex.IsMatch(dir.Name, sKatDzien))
                {
                    listaNazwKat.Add(dir.Name); //...dodaj nazwę tego podkatalogu do listy pasujących
                }
            }
            //znamy ilość pasujących katalogów więc inicjujemy tablicę zwracaną
            string[][] kiedyJakaNiunia = new string[listaNazwKat.Count][];

            //dla każdego, pięknego dnia, którego "nie zmarnowałem" przed kompem...
            for (int i = 0; i < listaNazwKat.Count; i++)
            {
                //pobierz listę plików ze zdjęciami tych pięknych akurat...
                string[] listaPieknych = Directory.GetFiles(katalogMiesieczny + listaNazwKat[i] + @"\", "niunia_*");
                //... i zainicjuj "podtablicę" pięknych w danym dniu:
                kiedyJakaNiunia[i] = new string[listaPieknych.Length + 1];
                kiedyJakaNiunia[i][0] = listaNazwKat[i];
                //dla każdej pięknej...
                for (int j = 0; j < listaPieknych.Length; j++)
                {
                    file = new FileInfo(listaPieknych[j]);
                    kiedyJakaNiunia[i][j + 1] = file.Name;
                }
            }
            //no i w końcu: przypomnij mi kiedy widziałem te wszystkie piękne...
            return kiedyJakaNiunia;
        }

A na poważnie proszę o wszelką konstruktywną krytykę do powyższego.
Może można prościej...

Pozdro

0
pastefqa napisał(a)

No i właśnie o tym myślałem kiedy mówiłem "niedosyt" - nie pasuje mi przede wszystkim konieczność "wymiarowania" tablicy.

No ale tak już jest z tablicami, muszą mieć wymiar. A jeśli ma on być dynamiczny, to trzeba użyć kolekcji, np. List.

Że już nie wspomnę o tym samym typie danych dla wszystkich składowych.

Tego zdania nie rozumiem. Przecież jest ideą wszelkich tablic jest trzymanie grupy obiektów tego samego typu razem.

Ale czy nie byłoby fajnie nie pamiętać o tym i mieć np. taką tablicę:

myArray[0] = {string, int, int, int};
myArray[1] = {string, int, int};
myArray[2] = {string, int, int, int, int};

Fajnie.
Dlatego właśnie można tworzyć własne klasy.
Czy nie fajnie byłoby mieć klasę z polem typu string i polem typu List<int>, a następnie obiekty tej klasy wrzucić do kolekcji? Niby to samo, ale jakoś tak... obiektowo?

bo właśnie coś takiego chciałem uzyskać na początku (okazało się to błędnym podejściem).

A poniżej mój przykład - proszę o ewentualne uwagi.

Odnośnie Twojego komentarza w kodzie - nie inicjacja, tylko inicjalizacja. Zmienne się inicjalizuje, a co to inicjacja, to nie muszę chyba tłumaczyć.

Ja to widziałbym tak:

private string[][] zliczNiunie(string katalogMiesieczny)
{
List<List<string>> nazwyPlików = new List<List<string>>();
foreach(var dir in new DirectoryInfo(katalogMiesieczny>().GetDirectiories())
{
    if(Regex.IsMatch(dir.Name, @"^\d{2}.\d{2}$"))
    {
        List<string> plikiWKatalogu = new List<string>();
        foreach(var fi in dir.GetFiles("niunia_*"))
        {
            plikiWKatalogu.Add(fi.Name);
        } 
        nazwyPlików.Add(plikiWKatalogu);
    }
}
}

Brakuje tu tylko przetworzenia List<List<string>> w string[][]. Ale to chyba można łatwo zrobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1