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