【问题标题】:C# ignores trailing space in value when using DataTable's Select command使用 DataTable 的 Select 命令时,C# 忽略值中的尾随空格
【发布时间】:2013-05-06 13:19:28
【问题描述】:

当我尝试从 DataTable 访问末尾带有空格的值时,C# 无法识别它。澄清一下,Select(columnName + " = '" + value + "'")[0][newColumnName].ToString(); 中的 value 变量不能有尾随空格,否则 C# 会产生不准确的结果。

问题是,我有一个等效的 LINQ 可以正常工作,但我不确定如何创建等效的“设置”函数。

因此,答案要么是修复 C# 中这个明显错误的方法,要么是帮助为我的 LINQ get() 编写等效的 LINQ set() 函数(即不使用 Select() )。两种解决方案都会更好。

这是完整的工作代码,您可以使用它来展示我目前拥有的内容并重现错误。我得到的输出是:green,red,red,also-red ....当它应该是:green,red,also-red,also-red

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace datatable_trailing_space_bug
{
    class Program
    {
        static void Main(string[] args)
        {
            SuperDataTable table = new SuperDataTable();

            /////////////////////////////
            table.Columns.Add("fruitName", typeof(string));
            table.Columns.Add("colour", typeof(string));

            //////////////  name, type, colour, length
            table.Rows.Add("apple", "green");
            table.Rows.Add("banana", "yellow");
            table.Rows.Add("strawberry", "red");
            table.Rows.Add("strawberry ", "also-red");

            Console.WriteLine(table._get_FAILS_ON_TRAILING_SPACE("fruitName", "apple", "colour"));          // This works - "green"
            Console.WriteLine(table._get_FAILS_ON_TRAILING_SPACE("fruitName", "strawberry", "colour"));     // This works - "red"
            Console.WriteLine(table._get_FAILS_ON_TRAILING_SPACE("fruitName", "strawberry ", "colour"));    // This fails due to trailing space - "red" (should be "also-red")
            Console.WriteLine(table._get_WORKS("fruitName", "strawberry ", "colour"));                      // This works - "also-red"


            Console.ReadLine();
        }


    }


    public class SuperDataTable : DataTable
    {
        public SuperDataTable()
        {
        }
        public string _get_FAILS_ON_TRAILING_SPACE(string columnName, string value, string newColumnName)       {
            value = value.Replace("'", "''");
            return Select(columnName + " = '" + value + "'")[0][newColumnName].ToString();
        }
        public void _set_FAILS_ON_TRAILING_SPACE(string columnName, string value, string newColumnName, string newValue) {
            value = value.Replace("'", "''");
            Select(columnName + "='" + value + "'")[0][newColumnName] = newValue;
        }

        public string _get_WORKS(string columnName, string value, string newColumnName) {
            string output = this.AsEnumerable()
                .Where(s => s.Field<string>(columnName).Equals(value))
                .Select(s => s.Field<string>(newColumnName)).FirstOrDefault();
            return output;
        }
        public void _set_WORKS(string columnName, string value, string newColumnName, string newValue) {
            // Enter working code here please.
        }

    }
}

【问题讨论】:

    标签: c# linq select datatable


    【解决方案1】:

    显然,这已成为一项功能。

    https://connect.microsoft.com/VisualStudio/feedback/details/700010/datatable-select-trailing-blanks-in-search-string

    在仔细分析后,我们得出结论,如果我们解决此问题,我们可能会破坏依赖此问题的现有应用程序。因此,我们将关闭此问题,因为不会修复。

    【讨论】:

    • 这也是我得到的。倒数第二个“红色”是错误。它应该是:绿色,红色,也红色,也红色。我已经编辑了这个问题以进一步澄清这一点。顺便说一句,我认为这应该是我问题下方的评论,而不是答案本身。
    • @DanW,您将来可能想发布更简单的工作示例。我也认为这应该是一个评论,但除了我自己的回答之外,我没有足够的声誉发表评论。如果我没有那样做,你就不会引起任何人的注意。 :( 我已将响应编辑为正确的响应。顺便说一下,这不是 C# 问题。这是与 DataTables 相关的 .NET BCL(基类库)问题。您可能想要删除 C# 和 LINQ 标记扩大问题的范围,从他人身上受益和/或帮助他人。
    • 谢谢。听到微软实际上会忽略像这样基本的东西,这令人失望。我仍然会坚持使用 LINQ 风格的答案或其他一些解决方法。我认为保留标签不会有任何危害,因为我认为 MORE,如果他们留意那些特定标签,不少人会看到它。
    • 完全同意。应以全局设置或某种开关的形式提供解决方法。对于选择,您使用 LINQ。但我想知道 DataViews 的情况如何。
    【解决方案2】:

    这是使用 SetField(DataRow, String, T) extension method 的有效 Linq 选项:

        public void _set_WORKS(string columnName, string value, string newColumnName, string newValue) {
             var output = this.AsEnumerable()
                .Where(s => s.Field<string>(columnName).Equals(value))
                .FirstOrDefault();
            output.SetField<string>(newColumnName, newValue);
        }
    

    【讨论】:

    • 只要你知道怎么做就很简单 - 谢谢!赏金如约而至。如果有人想为“其他方式”提供解决方案,那仍然很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2021-03-25
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多