【问题标题】:Susbtring from a data table column来自数据表列的子字符串
【发布时间】:2019-03-09 22:35:21
【问题描述】:

谁能帮我解决这个问题?

我有一个从数据库中填充的数据表“dt”。 我的 dt 有几列需要子字符串。我想在特定字符(=)之后砍掉字符。并将其推回我的 dt。

我一直在尝试不同的东西,但没有任何效果。我确定我错过了一些东西。

private DataTable MyTableWhenExport(DataTable dt) {
    if (dt != null && dt.Rows.Count > 0) {
        (dt.Columns["MyColumn"]) = dt["yMyColumn"]
            .Substring(0, dt["MyColumn"].LastIndexOf("=") + 1); // My substring code here
    }
    return dt;
} 

有人可以帮我解决这个问题吗

【问题讨论】:

  • 你试过什么?请贴出相关代码。
  • 感谢您的回复,。我已经添加了我的功能。感谢您的帮助
  • 由于您是新来的(欢迎!),请始终记住还包括您遇到的异常,并清楚地指出它被抛出的位置。

标签: c# linq datatable substring


【解决方案1】:

你可以使用

string firstPart = theString.Split('=')[0];

检索= 之前的部分。如果字符串不包含等号,则返回整个字符串。

如果字符串可以是null,则使用

string firstPart = theString?.Split('=')[0];

您必须访问DataTable 的行。 dt.Columns 仅包含列定义(如标题),而不包含实际的单元格值。

DataRow row = dt.Rows[0];
string oldValue = (string)row["MyColumn"];  // Returns an object. Therefore cast to string.
row["MyColumn"] = oldValue?.Split('=')[0];

【讨论】:

  • 感谢您的回复。这不起作用。我已经添加了我的代码。请看看这是否有帮助。感谢任何帮助
  • “不起作用”不是一个有用的解释。会发生什么?您遇到的是编译器错误还是运行时异常,是哪一个?
【解决方案2】:

如果您想对表中的每一行都执行此操作,则必须执行以下操作:

    DataTable MyTableWhenExport(DataTable dt)
    {
        // insert argument checking here

        foreach (var dataRow in dt.AsEnumerable())
        {
            var value = dataRow.Field<string>("MyColumn");

            if (string.IsNullOrWhitespace(value))
            {
                // handle accordingly
            }
            else
            {
                value = value.Substring(0, value.LastIndexOf('=') + 1);
                dataRow.SetField("MyColumn", value);
            }
        }

        return dt;
    }

请注意,您不能通过直接索引 DataTable 来访问行值。

此外,此答案假定您可以使用 LINQ。

请注意,如果字符串有可能不包含=LastIndexOf 将返回-1。我还没有测试过,但看起来在这种情况下内容会被截断(或者抛出异常,如果Substring 不喜欢你要求长度为 0 的子字符串。我不记得了)。

【讨论】:

    【解决方案3】:

    你已经有什么代码了?

    我想你需要类似的东西:

    dt["yourColumn"] = dt["yourColumn"].Substring(0, dt["yourColumn"].LastIndexOf("=") + 1);
    

    祝你好运!

    编辑: 对不起,我上面的回答是完全错误的!我使用数据集和数据表已经很长时间了(实体框架使这个过时了)。 您首先需要引用要修改的行,然后是列(即字段)。

    类似:

    dt[0]["yourColumn"] = dt[0]["yourColumn"].Substring(0, dt[0]["yourColumn"].LastIndexOf("=") + 1);
    

    0 是要更改的行的索引。

    【讨论】:

    • 感谢您的回复。这不起作用。我已经添加了我的代码。请看看这是否有帮助。感谢任何帮助
    • 您确定 dt 包含行吗?您是否尝试调试以查看究竟发生了什么?你没有收到错误是吗?
    • 作业左边的括号有点怪,我觉得还是去掉比较好。所以 dt.Columns["MyColumn"] = ... 而不是 (dt.Columns["MyColumn"]) = ...
    • dt 包含数据。根据您的建议进行更改后,我得到以下错误属性或索引器“DataColumnCollection.this[string]”无法分配给 DataColumn”不包含“子字符串”的定义,并且没有可访问的扩展方法“子字符串”可以找到接受“DataColumn”类型的第一个参数(您是否缺少 using 指令或程序集引用?) D​​ataColumn'不包含“LastIndexOf”的定义,并且没有可访问的扩展方法“LastIndexOf”接受类型的第一个参数'DataColumn' 可以找到
    • 对不起,我的错。参照。我编辑的答案。奥利维尔的回答更好...... :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2023-02-02
    相关资源
    最近更新 更多