• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# użycie funkcji Split przy tablicy string

Object Storage Arubacloud
+1 głos
427 wizyt
pytanie zadane 29 października 2021 w C# przez VerneX Nowicjusz (130 p.)

Hej, 

Na pewno wielu z Was kojarzy książkę, "Wstęp do programowania w C# Łatwy podręcznik dla początkujących". Jest tam oto takie zadanie:

"W danej firmie środki trwałe mają identyfikatory złożone z kilku liter, myślnika oraz czterech cyfr. Te cztery cyfry to rok zakupu danego środka trwałego. Przykładowe identyfikatory to: KOMG-2002, BH-2010. Napisz program, który deklaruje 5-cio elementową tablicę typu string dla środków trwałych, którą należy zainicjalizować przykładowymi identyfikatorami w czasie deklaracji. Program ma dla każdego środka trwałego podać liczbę lat, jakie upłynęły od jego zakupu."

 

I tu moje pytanie moja tablica wygląda następująco:

string[] tab = { "xxxx-2010", "yyy-2012", "zz-2014", "aaaa-2018", "bbbbbbb-2021" };

spróbowałem wykonać kod:

string[] tab = { "komp-2010", "lap-2012", "ps-2014", "xbox-2018", "lodowka-2021" };

            for(int i = 0; i > tab.Length; i++)
            {
                string[] subs = tab.Split('-');
            }
            Console.ReadLine();

Ale dostaje błąd CS1061

I tak wszędzie gdzie szukałem na internecie i wielu poradnikach wszyscy pokazują jak użyć funkcji split ale w przypadku string gdy wygląda następująco:

string tab = "komp-2010, lap-2012, ps-2014, xbox-2018, lodowka-2021";

 

I teraz pytanie właściwe: Czy istnieje jakieś rozwiązanie robiące split mojej tablicy, czy tak się tablicy nie zapisuje i powinna być tak jak wyżej?

2 odpowiedzi

0 głosów
odpowiedź 29 października 2021 przez adrian17 Ekspert (344,860 p.)
            for(int i = 0; i > tab.Length; i++)
            {
                string[] subs = tab.Split('-');

hint: zauważ, że nigdzie tutaj w środku pętli nie używasz `i` :)

 

Jak chcesz operować na i-tym elemencie tablicy, to musisz ją zaindeksować - używając `[i]`. Alternatywnie, znacznie prościej nie myśleć o indeksach i po prostu użyć pętlę `foreach`.

komentarz 29 października 2021 przez VerneX Nowicjusz (130 p.)

To już jest któraś wersja kodu wiec dużo razy zmieniałem wiem, że powinno być coś w tym stylu

for(int i = 0; i > tab.Length; i++)
{

    string[] subs[i] = tab[i].Split('-');
}

 

ale taki kod też mi nie działa komunikat błędu taki sam

komentarz 29 października 2021 przez adrian17 Ekspert (344,860 p.)
No, raczej nie ten sam błąd...? Bo teraz z kolei `subs[i]` nie ma sensu, nie ma czegoś takiego jak "indeksowanie w nazwie zmiennej". To wcześniej było dobre.
0 głosów
odpowiedź 29 października 2021 przez Velta Maniak (52,010 p.)

Należy rozdzielać elementy tablicy, nie tablicę:

List<string[]> arrays = new();
foreach (string element in tab)
{
    arrays.Add(element.Split('-'));
}
komentarz 29 października 2021 przez draghan VIP (106,230 p.)

Albo to samo inaczej, używając LINQ:

using System.Linq;

// ...

var yearsList = tab.Select(element => element.Split('-')).ToList();

 

komentarz 30 października 2021 przez VerneX Nowicjusz (130 p.)

Niestety nie ogarniam jeszcze funkcji LINQ, natomiast wymyśliłem rozwiązanie i pewnie dla większości z Was jest ono głupie, ale dla mnie jak na początek jeżeli działa to nie jest głupie :D

 

            string[] tab = { "komp-2010", "lap-2012", "ps-2014", "xbox-2018", "lodowka-2021" };
            string[] sub;
            var str = String.Join("-", tab);
            Console.WriteLine(str);

            sub = str.Split('-');

            for (int i = 0; i < sub.Length; i++)
            {
                Console.Write("Dla produktu ");
                Console.Write(sub[i]);
                Console.Write(" data zakupu to: ");
                i += 1;
                Console.Write(sub[i]);
                Console.WriteLine("");
            }

            Console.ReadLine();

 

1
komentarz 30 października 2021 przez draghan VIP (106,230 p.)

Nie jest "głupie", powiedziałbym że podejście połączenia wszystkiego myślnikiem i potem posplitowanie po myślniku jest całkiem interesujące.

Aczkolwiek powinieneś wyrobić sobie nawyk zwracania uwagi na to, jakich struktur danych używasz i do czego są one wykorzystywane.

Tutaj, w tablicy `sub`, przechowujesz wrzucone luzem dane pomieszanych wszystkich produktów i co więcej - pomieszanych ich nazw i dat zakupu:

W podejściu zaproponowanym wcześniej - czyli splitując osobno każdy element i dodając wynik do listy, dostajemy coś bardziej ustrukturyzowanego: listę która zawiera dane każdego produktu z osobna, gdzie pod indywidualnym indeksem masz dane tylko jednego produktu: jego nazwę i datę zakupu.

Na takiej liście się łatwiej operuje, bo jest logicznie poukładana. Nie polegasz w programie na niezapisanej wprost zasadzie, że co dwa indeksy w `tab` zmienia się produkt; stąd już tylko nieduży krok do ponazywania anonimowych zmiennych siędzących pod indeksami 0, 1 każdej "podlisty" i wrzucenia ich w nazwaną strukturę/klasę. Ale to, zakładam, będziesz dopiero przerabiał. :)

1
komentarz 30 października 2021 przez VBService Ekspert (252,740 p.)
edycja 30 października 2021 przez VBService

@VerneX, Twoja pierwsza wersja nie była taka zła ...

Program ma dla każdego środka trwałego podać liczbę lat, jakie upłynęły od jego zakupu

( on-line )

using System;
 
class HelloWorld {
  static void Main() {
    string[] tab = { "komp-2010", "lap-2019", "ps-2014", "xbox-2018", "pralka-2020", "lodowka-2021" };
  
    for(int i=0; i<tab.Length; i++)
    {
        string[] subs = tab[i].Split('-');
        Console.WriteLine($"Dla produktu: {subs[0]}");
         
        int span = DateTime.Now.Year - Convert.ToDateTime($"1/1/{subs[1]}").Year;
        string year_pl = (span <= 1)  ?
                         ((span == 0) ? "nie uplynol jeszcze rok" : "uplynol rok") :
                         (span < 5)   ? $"uplynely {span} lata"   : $"uplynelo {span} lat";
                          
        Console.WriteLine($"Od daty zakupu {year_pl}\n");
    }
     
    Console.ReadLine();
  }
}

 

Podobne pytania

0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 29 grudnia 2021 w SQL, bazy danych przez okti00 Obywatel (1,300 p.)
0 głosów
1 odpowiedź 208 wizyt
pytanie zadane 29 grudnia 2018 w Java przez krzycholl18 Nowicjusz (220 p.)
0 głosów
3 odpowiedzi 829 wizyt
pytanie zadane 13 sierpnia 2019 w C# przez AidenX Nowicjusz (150 p.)

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...