tags:

views:

53

answers:

2

I have a database that deconstructs an x,y coordinate pair table into specific dataitems.

Coordinate
{
   int X,
   int Y,
   int Value
}

How do I rejoin these coordinates in Linq into a table? What if there are empty spaces in the Database (denoted by -):

             Y
          0  1  2
          -------
    0  |  4  6  7
 X  1  |  9  -  7
    2  |  6  3  5

How do I handle that in linq?

+2  A: 

LINQ is generally good for working with structured (one-dimensional) data such as databases or XML files, but I don't think it will help you when you need to create two-dimensional data structure.

If you just want to load the data into a 2D array, than it probably cannot get much nicer than the direct way of writing it (using Max extension method from LINQ to get the size):

int[,] values =  
  new int[coords.Max(c => c.X) + 1, coords.Max(c => c.Y) + 1];
foreach(var c in coords) 
  values[c.X, c.Y] = c.Value;

If you want to do it the other way round - to generate coordinates from a 2D array, then you can use LINQ's Enumerable.Range to generate indices of the 2D array and where to select elements that contain some actual value:

var coords = from i in Enumerable.Range(0, coords.GetLength(0))
             from j in Enumerable.Range(0, coords.GetLength(1))
             let v = coords[i, j]
             where v != '-'
             select new { X = i, Y = j, Value = Int32.Parse(v) }
Tomas Petricek
A: 

I assume that you stored the coordinates in an IEnumerable class. Then you can write an extension function such as

public static int ValueAt(this IEnumerable<Coordinate> enumeable, int X, int Y)
{
    Coordinate c = enumeable.Where(W=>W.x==X && W.y==Y).SingleOrDefault(); //works as long as their are no duplicate entries... 
    if(c==null){return ....;}  //Depends on how you want to handle nulls... may be return typr should be nullable<int> ?
    return c.Value;
}

Then you can call coordinates.ValueAt(1,0) etc...

Vivek