' freak.no - C# C# - Splitte string, og sortere
freak.no

freak.no (https://freak.no/forum/index.php)
-   Programmering (https://freak.no/forum/forumdisplay.php?f=49)
-   -   C# C# - Splitte string, og sortere (https://freak.no/forum/showthread.php?t=300358)

Osteper 14. november 2017 15:16

C# - Splitte string, og sortere
 
Hei!

Har noe erfaring med C++ fra før av, grunnet arduino programmering.
Men C# er helt nytt for meg.

Jeg har en string, med 8 forskjellige parametere. Disse er atskilt med ";".
F.eks: circle;10;-10;15;25;40;60;50

Jeg har lyst til å dele opp denne i 8 forskjellige stringer slik at jeg får:
par0: circle
par1: 10
par2: -10
par3: 15
...
par7: 50

Hva er den ekleste måten å få gjort dette på?
Har prøvd:

string[] values = data.Split(";");
int parameter1 = Int32.Parse(values[0]);
int parameter 2 =Int32.Parse(values[1]);
osv.

Men får feilkode, antakelig fordi jeg bruker int?

Takk på forhånd for hjelp! :)

0xFF 14. november 2017 15:25

Du for error fordi 'values[0]' inneholder en string og ikke int. Jeg tipper at 'Int32.Parse()' kaster en 'FormatException'. Dette kan løses på 3 måter.

1. Unngå å parse 'values[0].
2. Bruk 'Int32.TryParse()' og sjekk retur verdi.
3. Bruk try-catch block for å fange opp erroren. (Anbefalt)

nso 14. november 2017 15:27

Kode:

var stringArray = data.Split(";");
var str = stringArray.First();
var numberList = stringArray.Split(";").Skip(1).Select(Int32.Parse).ToList();

Drit i å blande string og int i samme array. Also... når du får en feilkode så opplyser du alltid om den når du spør om hjelp.

EDIT: Litt forvirret her. Du skriver du ønsker å dele strengen i et array med strenger? Men samtidig så bruker du int parsing?

Osteper 14. november 2017 15:54

Sitat:

Sitat av 0xFF (Innlegg 3408833)
Du for error fordi 'values[0]' inneholder en string og ikke int. Jeg tipper at 'Int32.Parse()' kaster en 'FormatException'. Dette kan løses på 3 måter.

1. Unngå å parse 'values[0].
2. Bruk 'Int32.TryParse()' og sjekk retur verdi.
3. Bruk try-catch block for å fange opp erroren. (Anbefalt)

Sitat:

Sitat av nso (Innlegg 3408835)
Kode:

var stringArray = data.Split(";");
var str = stringArray.First();
var numberList = stringArray.Split(";").Skip(1).Select(Int32.Parse).ToList();

Drit i å blande string og int i samme array. Also... når du får en feilkode så opplyser du alltid om den når du spør om hjelp.

EDIT: Litt forvirret her. Du skriver du ønsker å dele strengen i et array med strenger? Men samtidig så bruker du int parsing?

Beklager, tenkte ikke på å ta med feilkoden. Får en FormatException som 0xFF sier!

Som sagt, fersk på C# så aner ikke hva som bør gjøres! :rolleyes:

Takk for tips, skal prøves!

0xFF 14. november 2017 16:13

Du kan også løse det på måten som @nso foreslår. Men jeg vil fortsatt anbefale deg en try-catch blokk, for dette vil også fange opp eventuelt andre errorer i dataen som du ønsker å parse.

Kode:

while(<BETINGELSE>)
{
        try
        {
                result = Int32.Parse(values[i]);
        }
        catch(ArgumentNullException ex)
        {
                // Håndtere «values[i] is null» exception
        }
        catch(FormatException ex)
        {
                // Håndtere «values[i] is not in the correct format.» exception
        }
        catch(OverflowException ex)
        {
                // Håndtere «values[i] represents a number less than MinValue or greater than MaxValue.» exception
        }
       
}

Som du ser så kan Int32.Parse() kaste 3 forskjellige typer exceptions. Ved å lage en loop som looper igjennom f.eks en array og prøver å parse hver enkelt verdi, så vil du kunne få feilmeldinger hvis den feiler med å parse en verdi. Og på den måten så kan du drive debugging for å finne ut hva i dataen din som du prøver å parse, er årsaken til dette.

m0b 14. november 2017 18:36

Sitat:

Sitat av 0xFF (Innlegg 3408839)
Du kan også løse det på måten som @nso foreslår. Men jeg vil fortsatt anbefale deg en try-catch blokk, for dette vil også fange opp eventuelt andre errorer i dataen som du ønsker å parse.

Kode:

while(<BETINGELSE>)
{
        try
        {
                result = Int32.Parse(values[i]);
        }
        catch(ArgumentNullException ex)
        {
                // Håndtere «values[i] is null» exception
        }
        catch(FormatException ex)
        {
                // Håndtere «values[i] is not in the correct format.» exception
        }
        catch(OverflowException ex)
        {
                // Håndtere «values[i] represents a number less than MinValue or greater than MaxValue.» exception
        }
       
}

Som du ser så kan Int32.Parse() kaste 3 forskjellige typer exceptions. Ved å lage en loop som looper igjennom f.eks en array og prøver å parse hver enkelt verdi, så vil du kunne få feilmeldinger hvis den feiler med å parse en verdi. Og på den måten så kan du drive debugging for å finne ut hva i dataen din som du prøver å parse, er årsaken til dette.

Her tror jeg det kan være greit å gjøre om rekkefølgen på try-catch og while-loopen. Husk på at du genererer ovehead med try-catch og for hver iterasjon skal stacket med. Her skal du uansett også stoppe etter første exception.

0xFF 14. november 2017 19:55

Sitat:

Sitat av |d13m0b (Innlegg 3408864)
Her tror jeg det kan være greit å gjøre om rekkefølgen på try-catch og while-loopen. Husk på at du genererer ovehead med try-catch og for hver iterasjon skal stacket med. Her skal du uansett også stoppe etter første exception.

Ja, hvis du vil stoppe etter første exception, så bør man bytte om på try-catch og while loopen. Tanken min var bare å spytte ut en warning til 'Console.Error' ved exceptions, så var det opp til brukeren hvorvidt han ville avbryte innlesingen med '^C' og gå tilbake for å rette feilen i dataen som leses. Eller hvorvidt han ville ignorere feilen og la programmet fortsette innlesingen.


Alle tidspunkt er GMT +2. Klokken er nå 05:32.