c#在使用DataTable's的Select命令时忽略value后面的空格

本文关键字:命令 value 空格 Select DataTable | 更新日期: 2023-09-27 18:12:22

当我尝试访问DataTable末尾有空格的值时,c#无法识别它。需要说明的是,:Select(columnName + " = '" + value + "'")[0][newColumnName].ToString();中的value变量不能有尾随空格,否则c#将产生不准确的结果。

事情是,我有一个LINQ等效的工作正常,但我不确定如何创建一个等效的'set'函数。

所以答案要么是一种方法来修复这个明显的bug在c#中,或帮助编写一个等效的LINQ set()函数到我的LINQ get()(即不使用Select())。两种解决方案都会更好。

下面是完整的工作代码,您可以使用它来展示我目前的成果,并重现bug。我得到的输出是:绿色,红色,红色,也是红色....当它应该是:green, red, so-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#在使用DataTable's的Select命令时忽略value后面的空格

显然,这已经成为一个功能。

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

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

下面是Linq选项,使用SetField(DataRow, String, T)扩展方法:

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