Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 1318
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!
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
popålol
nso's Avatar
Administrator

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?
Sist endret av nso; 14. november 2017 kl. 16:31.
Cheez Doodles
Osteper's Avatar
Trådstarter
Sitat av 0xFF Vis innlegg
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)
Vis hele sitatet...
Sitat av nso Vis innlegg

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?
Vis hele sitatet...
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!

Takk for tips, skal prøves!
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.
Sitat av 0xFF Vis innlegg
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.
Vis hele sitatet...
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.
Sitat av |d13m0b Vis innlegg
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.
Vis hele sitatet...
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.