Reputation: 713
I have a data set in string format. These are some coordinates which I got through image processing. I have attached the code which extracts those(coordinates) and stored in a single array.From those coordinates, I found x values which are similar.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stack
{
class Program
{
static void Main(string[] args)
{
int count = 0;
//String which have my coordinates
string TextFile = "[(27, 37), (27, 38), (27, 163), (27, 164), (27, 266), (27, 267), (27, 356), (27, 357), (27, 448), (27, 449), (27, 528), (27, 529), (28, 37), (28, 38), (28, 163), (28, 164), (28, 266), (28, 267), (28, 356), (28, 357), (28, 448), (28, 449), (28, 528), (28, 529), (51, 163), (51, 164), (51, 266), (51, 267), (51, 356), (51, 357), (51, 448), (51, 449), (52, 61), (52, 62), (52, 163), (52, 164), (52, 266), (52, 267), (52, 280), (52, 305), (52, 306), (52, 356), (52, 357), (52, 448), (52, 449), (52, 504), (52, 505), (53, 61), (53, 62), (53, 280), (53, 281), (53, 305), (53, 306), (53, 504), (53, 505), (355, 61), (355, 62), (355, 280), (355, 281), (355, 305), (355, 306), (355, 504), (355, 505), (356, 61), (356, 62), (356, 280), (356, 281), (356, 305), (356, 306), (356, 504), (356, 505), (380, 37), (380, 38), (380, 528), (380, 529), (381, 37), (381, 38), (381, 528), (381, 529)]";
string splits = TextFile.TrimStart('[');
string[] split = TextFile.Split(')');
string split_1 = null;
string split_2 = null;
string split_3 = null;
int pos = 0;
int lengthOfString = 0;
int valX, valZ, valX1, valZ1 = 0;
/*
* Getting the count of the coordinates in the array
*/
foreach (string x in split)
{
count++;
}
string[] stringArr = new string[count];
/*
* Splitting the coordinates as x,y and store in an array
*/
foreach (string coord in split)
{
split_1 = coord;
split_1 = split_1.Trim('[');
split_1 = split_1.Trim('(');
split_1 = split_1.Trim(',');
split_1 = split_1.Trim(' ');
split_1 = split_1.Trim('(');
split_1 = split_1.TrimEnd(']');
stringArr[pos] = split_1;
pos++;
}
Console.WriteLine("Array Length " + stringArr.Length);
/*
* extracting simalar x coordinates
*/
Console.WriteLine("");
Console.WriteLine("-----------------extracting simalar x coordinates----------------");
Console.WriteLine("");
int indexX = 0;
int loopRunX = 0;
for (int a = 0; a < stringArr.Length - 1; a = indexX)
{
split_2 = stringArr[a];
lengthOfString = split_2.Length;
valX = int.Parse(split_2.Substring(0, split_2.IndexOf(',')));
valZ = int.Parse(split_2.Substring(split_2.IndexOf(' '), (lengthOfString - split_2.IndexOf(' '))));
int countx = 0;
for (int x1 = indexX; x1 < stringArr.Length - 1; x1++)
{
split_3 = stringArr[x1];
lengthOfString = split_3.Length;
valX1 = int.Parse(split_3.Substring(0, split_3.IndexOf(',')));
valZ1 = int.Parse(split_3.Substring(split_3.IndexOf(' '), (lengthOfString - split_3.IndexOf(' '))));
//Check for the simillar x in the text file we provide
if (valX == valX1)
{
countx++;
Console.WriteLine("X is " + valX + " and the coordinates which have simillar x ==> (" + valX1 + ", " + valZ1 + "). Index is " + x1 + " Count is " + countx);
}
else
{
break;
}
}
loopRunX++;
indexX = indexX + countx;
//Console.WriteLine("Next Index to check onwards : " + indexX);
//Console.WriteLine("Looping Count : " + loopRunX);
Console.WriteLine("");
}
Console.ReadLine();
}
}
}
I want to store those similar x values in separate arrays. eg : value 27 appears 12 times and i want to store those values into one single array.value 28 appears 12 times,same as above it should store all 28 values in a single array. But i don't know how many arrays will be needed for this.May i know a solution to store these similar coordinates together in a single array dynamically?
Upvotes: 0
Views: 259
Reputation: 1357
You can use LINQ GroupBy method.
class Program
{
static void Main(string[] args)
{
int count = 0;
//String which have my coordinates
string TextFile = "[(27, 37), (27, 38), (27, 163), (27, 164), (27, 266), (27, 267), (27, 356), (27, 357), (27, 448), (27, 449), (27, 528), (27, 529), (28, 37), (28, 38), (28, 163), (28, 164), (28, 266), (28, 267), (28, 356), (28, 357), (28, 448), (28, 449), (28, 528), (28, 529), (51, 163), (51, 164), (51, 266), (51, 267), (51, 356), (51, 357), (51, 448), (51, 449), (52, 61), (52, 62), (52, 163), (52, 164), (52, 266), (52, 267), (52, 280), (52, 305), (52, 306), (52, 356), (52, 357), (52, 448), (52, 449), (52, 504), (52, 505), (53, 61), (53, 62), (53, 280), (53, 281), (53, 305), (53, 306), (53, 504), (53, 505), (355, 61), (355, 62), (355, 280), (355, 281), (355, 305), (355, 306), (355, 504), (355, 505), (356, 61), (356, 62), (356, 280), (356, 281), (356, 305), (356, 306), (356, 504), (356, 505), (380, 37), (380, 38), (380, 528), (380, 529), (381, 37), (381, 38), (381, 528), (381, 529)]";
string splits = TextFile.TrimStart('[');
string[] split = TextFile.Split(')');
string split_1 = null;
string split_2 = null;
string split_3 = null;
int pos = 0;
int lengthOfString = 0;
int valX, valZ, valX1, valZ1 = 0;
/*
* Getting the count of the coordinates in the array
*/
foreach (string x in split)
{
count++;
}
string[] stringArr = new string[count];
/*
* Splitting the coordinates as x,y and store in an array
*/
foreach (string coord in split)
{
split_1 = coord;
split_1 = split_1.Trim('[');
split_1 = split_1.Trim('(');
split_1 = split_1.Trim(',');
split_1 = split_1.Trim(' ');
split_1 = split_1.Trim('(');
split_1 = split_1.TrimEnd(']');
stringArr[pos] = split_1;
pos++;
}
Console.WriteLine("Array Length " + stringArr.Length);
//It is better to convert to Point type but to be short I've used your string
var groupedPoints = stringArr.GroupBy(
str => str.Split(',')[0]);
foreach (var group in groupedPoints)
{
Console.WriteLine("Group {0}", group.Key);
foreach (var point in group)
Console.WriteLine("\tPoint {0}", point);
}
Console.ReadLine();
}
}
}
Result:
Array Length 80
Group 27
Point 27, 37
Point 27, 38
Point 27, 163
Point 27, 164
Point 27, 266
Point 27, 267
Point 27, 356
Point 27, 357
Point 27, 448
Point 27, 449
Point 27, 528
Point 27, 529
Group 28
Point 28, 37
Point 28, 38
Point 28, 163
Point 28, 164
Point 28, 266
Point 28, 267
Point 28, 356
Point 28, 357
Point 28, 448
Point 28, 449
Point 28, 528
Point 28, 529
Group 51
Point 51, 163
Point 51, 164
Point 51, 266
Point 51, 267
Point 51, 356
Point 51, 357
Point 51, 448
Point 51, 449
Group 52
Point 52, 61
Point 52, 62
Point 52, 163
Point 52, 164
Point 52, 266
Point 52, 267
Point 52, 280
Point 52, 305
Point 52, 306
Point 52, 356
Point 52, 357
Point 52, 448
Point 52, 449
Point 52, 504
Point 52, 505
Group 53
Point 53, 61
Point 53, 62
Point 53, 280
Point 53, 281
Point 53, 305
Point 53, 306
Point 53, 504
Point 53, 505
Group 355
Point 355, 61
Point 355, 62
Point 355, 280
Point 355, 281
Point 355, 305
Point 355, 306
Point 355, 504
Point 355, 505
Group 356
Point 356, 61
Point 356, 62
Point 356, 280
Point 356, 281
Point 356, 305
Point 356, 306
Point 356, 504
Point 356, 505
Group 380
Point 380, 37
Point 380, 38
Point 380, 528
Point 380, 529
Group 381
Point 381, 37
Point 381, 38
Point 381, 528
Point 381, 529
This example is based on your code. But I would recommend to write your own MyPoint2d
class\struct with TryParse
method.
Thus you'll be able to convert
string TextFile
->MyPoint2d[] arrPts
and then group this array by MyPoint2d.x
Also you don't have to use static size arrays (string[]
). List<string>
will give you more freedom (no need to calculate size before array allocation).
Upvotes: 2