using System.Collections.Generic;
const float allowedGroupDeviation = 2;
static List<List<float[]>> SortAndGroup(List<float[]> data, int key)
List<float[]> sorted = data;
sorted.Sort((l, r) => l[key].CompareTo(r[key]));
List<List<float[]>> groups = new List<List<float[]>>();
groups.Add(new List<float[]>() { sorted[0] });
for (int i = 1; i < sorted.Count; i++)
float[] item = sorted[i];
List<float[]> currentSet = groups[groups.Count - 1];
float[] currentLowestInSet = currentSet[0];
if (item[key] - currentLowestInSet[key] < allowedGroupDeviation)
groups.Add(new List<float[]>() { item });
public static void Main()
string data = "35.13,43.412,12.92\n18.51,36.708,14.99";
string[] lines = data.Replace("\r", "").Split();
List<float[]> dataSet = new List<float[]>();
for (int i = 0; i < lines.Length; i++)
string[] splitStrs = lines[i].Split(',');
float[] nums = new float[] {
float.Parse(splitStrs[0]),
float.Parse(splitStrs[1]),
float.Parse(splitStrs[2]),
List<List<float[]>> finalGroups = new List<List<float[]>>();
List<List<float[]>> xGroups = SortAndGroup(dataSet, 0);
foreach (List<float[]> xGroup in xGroups)
List<List<float[]>> yGroups = SortAndGroup(xGroup, 1);
foreach (List<float[]> yGroup in yGroups)
List<List<float[]>> zGroups = SortAndGroup(yGroup, 2);
foreach (List<float[]> group in zGroups)
for (int i = 0; i < finalGroups.Count; i++)
output += "Group " + (i + 1) + ",,\n";
foreach (float[] item in finalGroups[i])
output += item[0] + "," + item[1] + "," + item[2] + "\n";
System.Console.Write(output);