当我尝试从DataTable
访问末尾空格的值时,C#无法识别它。为了澄清,value
中的Select(columnName + " = '" + value + "'")[0][newColumnName].ToString();
变量不能有尾随空格,否则C#会产生不准确的结果。
事情是,我有一个LINQ等效的工作正常,但我不知道如何创建一个等效的'设置'功能
所以答案要么是在C#中解决这个明显错误的方法,要么是帮助在我的LINQ set()
中编写等效的LINQ get()
函数(即不使用Select()
)。两种解决方案都会更好。
这里是您可以使用的完整工作代码,以显示我目前所拥有的,并重现该错误。我得到的输出是:绿色,红色,红色,红色....当它应该是:绿色,红色,也红色,也红色
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.
}
}
}
答案 0 :(得分:3)
显然,这已经成为一种功能。
在仔细分析之后,我们得出结论,如果我们解决这个问题,我们可能会破坏依赖于此问题的现有应用程序。因此,我们将关闭此问题,因为无法解决。
答案 1 :(得分: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);
}