【问题标题】:DataTable in .NET 4.0 Update with LINQ?.NET 4.0 中的 DataTable 使用 LINQ 更新?
【发布时间】:2011-11-29 16:20:33
【问题描述】:

我有一个如下所示的 DataTable。我想知道是否有人知道使用 Linq 根据字符串长度规则的 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 列和 1000 行。规则表有 180 行(每列一个),所以我希望大师可以评论我如何使用 Linq 做一些动态的事情,以根据规则表中的内容从 testtable 中获取最左边的字符。

谢谢。

【问题讨论】:

  • 我正在玩 DataTable.AsEnumerable 和 SetField 但到目前为止还没有取得任何进展。

标签: linq datatable dataset


【解决方案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# 重写它,请告诉我,我会尽快编辑它。

【讨论】:

    【解决方案2】:

    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 真正能为您做的最多的事情是 DataTable 上的 .AsEnumerable() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多