2011-11-29 47 views
0

我有一個如下所示的DataTable。我想知道是否有人知道使用Linq根據字符串長度規則的DataTable截斷行值的一種很酷的方式。使用LINQ .NET 4.0更新DataTable?

表的數據:

 var testtable = new DataTable(); 
     testtable.Columns.Add("cola" , typeof(String)); 
     testtable.Columns.Add("colb" , typeof(String)); 
     testtable.Columns.Add("colc" , typeof(String)); 
     testtable.Rows.Add(new object[] { "1" , "22" , "333" }); 
     testtable.Rows.Add(new object[] { "4444" , "55555" , "666666" }); 
     testtable.Rows.Add(new object[] { "7777777" , "88888888" , "999999999" }); 

表的規則:

 var ruletable = new DataTable(); 
     ruletable.Columns.Add("columnname" , typeof(String)); 
     ruletable.Columns.Add("length" , typeof(Int32)); 
     ruletable.Rows.Add(new object[] { "colb" , 3 }); 
     ruletable.Rows.Add(new object[] { "colc" , 4 }); 

數據的真實生命表有180列和1,000行。規則表有180行(每列一列),所以我希望大師能夠評論我如何能夠用Linq做一些動態的事情,根據規則表中的內容從測試表中取出最左邊的字符。

謝謝。

+0

我正在玩DataTable.AsEnumerable和SetField,但到目前爲止沒有任何地方。 – Snowy

回答

1

這可能不像你想要的那樣(而且它沒有使用Linq),但它很直接,而且很有效。我用VB編寫了它,因爲我對它的速度有點快,但是如果你需要我用C#編輯我的答案,我可以在幾分鐘內完成。

'loop through all of the rows in testtable' 
For Each tr As Data.DataRow In testtable.Rows 
    tr.BeginEdit() 

    'loop through all of the rules' 
    For Each drrule As Data.DataRow In ruletable.Rows 
     'update the value in testtable column represented by rule rows "columnname" field' 
     'based on the rules rows "length" field' 
     tr(drrule("columnname")) = Left(tr(drrule("columnname")), drrule("length")) 
    Next 
    tr.AcceptChanges() 
Next 

讓我知道如果你需要我用C#重寫它,我會盡快編輯它。

1

LINQ在這裏沒有太多的幫助 - 它通常用於查詢數據,而不是改變它。既然你想更新每一行的狀態,你最好使用命令式的方法。嵌套的foreach可能是最合適的。你應該首先遍歷規則,以避免解析的每一行的長度testTable

foreach(var ruleRow in ruleTable.AsEnumerable()) 
{ 
    var columnName = ruleRow.Field<string>("columnname"); 
    var length = ruleRow.Field<int>("length"); 

    foreach(var testRow in testTable.AsEnumerable()) 
    { 
     var value = testRow.Field<string>(columnName); 

     testRow.SetField(columnName, value.Substring(0, length)); 
    } 
} 

LINQ最多隻能被用於查詢截斷值,但你仍然會做一個foreach執行更新。大部分LINQ都可以爲你做的.AsEnumerable()方法DataTable