2016-06-01 5 views
0

Ich habe einen Datensatz im String-Format. Das sind einige Koordinaten, die ich durch die Bildverarbeitung bekommen habe. Ich habe den Code angehängt, der diese (Koordinaten) extrahiert und in einem einzigen Array speichert. Aus diesen Koordinaten habe ich ähnliche Werte gefunden.erstellen unbekannte Anzahl von Arrays dynamisch und setzen Sie Werte auf

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

Ich will diese ähnlichen x Werte in separaten Arrays speichern. zB: Wert 27 erscheint 12 Mal und ich möchte diese Werte in einem einzigen Array speichern. Wert 28 erscheint 12 mal, genauso wie oben sollte er alle 28 Werte in einem einzigen Array speichern. Aber ich weiß nicht, wie viele Arrays dafür benötigt werden. Kann ich eine Lösung kennen, um diese ähnlichen Koordinaten dynamisch in einem einzigen Array zu speichern?

+0

Wenn Sie sich der Länge nicht sicher sind, verwenden Sie einfach eine Liste, Sie können diese immer wieder in ein Array konvertieren, sobald Sie fertig sind. – nik0lias

Antwort

2

Sie können die Methode LINQ GroupBy verwenden.

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

Ergebnis:

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 

Dieses Beispiel auf dem Code basiert. Aber ich würde empfehlen, Ihre eigene MyPoint2d Klasse \ struct mit TryParse Methode zu schreiben.

So können Sie konvertieren

string TextFile ->MyPoint2d[] arrPts

und dann die Gruppe dieses Array von MyPoint2d.x

Auch Sie haben keine statische Größe Arrays zu verwenden, (string[]). List<string> gibt Ihnen mehr Freiheit (keine Größe vor der Array-Zuweisung zu berechnen).

+0

Sir danke für den nützlichen Code. Wenn ich nach y-Wert gruppieren möchte, muss ich ändern var gruppiertePunkte = stringArr.GroupBy ( str => str.Split (',') [1]); –

+0

Ja. Aber dieser Code ist unsicher und langsam. Ich empfehle, zuerst in ein Array von "int", "int" Punkten zu konvertieren. –

+0

Sir, ich habe Probleme beim Gruppieren zum Y. Können Sie mir dabei helfen? –

Verwandte Themen