Witam,
Chodzi o to że mam linijkę w textboxie z takim ciągiem znaków: 44, 23, 5 { 43: placed blue Tra. bunker } i chce by fragment " 44, 23, 5" został zapisany do jednej zmienny a "bunker " do kolejnej . Jak to zrobić?
Witam,
Chodzi o to że mam linijkę w textboxie z takim ciągiem znaków: 44, 23, 5 { 43: placed blue Tra. bunker } i chce by fragment " 44, 23, 5" został zapisany do jednej zmienny a "bunker " do kolejnej . Jak to zrobić?
Teoretycznie pasowałyby np. wyrażenia regularne - ale zanim się za to zabierzesz, opowiedz skąd wyciągasz taki dziwny format danych i w jakim celu tego potrzebujesz.
Być może mamy do czynienia z tzw. problemem XY.
Są to kordynaty budynku który jest umieszczony w grze, ten szereg danych przedstawia koordynaty, kierunek budynki i typ budynku a jest mi to potrzebne ponieważ koordynaty i jego typ chce wywołać w komendzie na ich budowę jeśli zostaną zniszczone.
int n = str.FirstOf('{');
string koord = str.SubString(0, n-1);
Potem wyszukujesz zakończenie nawiasu klamrowego i tak jak sobie ułożysz tak będzie
2 sposoby
string input = " 44, 23 , 5 { 43: placed blue Tra. bunker } ";
var pos_xyz = input.Split(new[] { ',', '{', '.', '}' })
.Select(x => x.Trim())
.ToArray()
.Take(3);
int index = input.IndexOf('.');
string output = input.Remove(1,index);
index = output.IndexOf('}');
output = output.Remove(index);
output = output.Trim();
foreach (var value in pos_xyz)
{
Console.WriteLine(value);
}
Console.WriteLine(output);
output:
44
23
5
bunker
string input = " 44, 23 , 5 { 43: placed blue Tra. bunker } ";
var arr = input .Split(new[] { ',', '{', '.', '}' })
.Select(x => x.Trim())
.ToArray();
List<string> output = new List<string>();
foreach (var value in arr)
{
if (Array.IndexOf(arr, value) != 3)
{
output.Add(value);
}
}
foreach (var value in output)
{
Console.WriteLine(value);
}
output:
44
23
5
bunker
@WeiXiao: to dalej jest bardzo nieoptymalne. Mój kod realizujący zadanie poniżej:
string input = " 44, 23, 5 { 43: placed blue Tra. bunker }";
int firstBrace = input.IndexOf('{');
int lastDot = input.LastIndexOf('.');
string coords = input.Substring(0, firstBrace).Trim();
string name = input.Substring(lastDot + 1).Trim(' ', '}');
Założenia - po ostatniej kropce w stringu jest nazwa budynku.
Mierząc czasy wykonania, mój kod zajmuje około 20 ticków, kod poprzednika prawie 1000 :)
Jasne, dla człowieka nie będzie znaczenia, ale czemu pisać tak nieoptymalny kod? Kilka takich figlarskich fragmentów i człowiek już zauważy różnice.
Przerobiłem by czytał mi każdą linijkę richtextboxa, 1 linijkę dobrze przetwarza lecz kolejne nie.
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < richTextBox2.Lines.Length; i++)
{
string input = richTextBox2.Lines[i];
int firstBrace = input.IndexOf('{');
int lastDot = input.LastIndexOf('.');
string coords = input.Substring(i, firstBrace).Trim();
string name = input.Substring(lastDot + 1).Trim(' ', '}');
richTextBox1.Text += "Build" + name + "\n" + "Coords" + coords;
}
}
A może tak:?
StringBuilder sb = new StringBuilder();
for...
{
sb.Append("Build");
sb.Append(richTextBox2.Lines[i].Substring(richTextBox2.Lines[i].LastIndexOf('.') + 1).Trim(' ', '}'));
sb.Append("\n");
sb.Append("Coords");
sb.Append( richTextBox2.Lines[i].Substring(i, richTextBox2.Lines[i].IndexOf('{')).Trim());
}
richTextBox1.Text += sb.ToString();