0

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();
        }
    }
}

enter image description here

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?

1
  • If you are unsure of the length, just use a List, you can always convert this back to an array once finished. Commented Jun 1, 2016 at 8:59

1 Answer 1

2

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).

Sign up to request clarification or add additional context in comments.

5 Comments

sir thanks for the useful code. If i want to group by y value then i have to change var groupedPoints = stringArr.GroupBy( str => str.Split(',')[1]);
Yes. But this code is unsafe and slow. I recommend to convert to array of int, 'int' points first.
Sir, I'm having a trouble grouping to the Y. Can you help me on that?
var groupedPoints = stringArr.GroupBy( str => { var sub = str.Split(','); return sub.Length > 1 ? sub[1] : string.Empty; });
that's completely different how I thought. Rather than the provided link(reference)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.