2010-09-27 38 views
0

我有一個數據庫,可以將x,y座標對錶解構成特定的數據項。加入來自X,Y的項目Linq的座標

Coordinate 
{ 
    int X, 
    int Y, 
    int Value 
} 

如何在Linq中將這些座標重新加入表中?如果還有空的空間在數據庫(由-表示):

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

如何處理,在LINQ?

+0

你是什麼意思表?你的意思是一個DataTable? – jsmith 2010-09-27 14:24:55

+0

datatable很好,匿名類型很好,基本上任何對象類型都包含可以按行迭代的結構。我想最終在中繼器或gridview上使用它。 – George 2010-09-27 14:30:44

回答

2

LINQ通常適用於處理結構化(一維)數據,如數據庫或XML文件,但我不認爲它會幫助您在需要創建二維數據結構時。

如果你只是想將數據加載到一個二維數組,比它可能無法得到比寫它的直接的方式好得多(使用Max擴展方法從LINQ得到大小):

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; 

如果你想這樣做的另一種方式圓 - 生成從二維數組座標,那麼你可以使用LINQ的Enumerable.Range生成二維數組的索引和where選擇包含一些實際的價值元素:

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

我假設您將座標存儲在IEnumerable類中。然後,你可以寫爲

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

然後就可以調用coordinates.ValueAt的擴展功能,例如(1,0)等等