【问题标题】:DataColumn class using bitwise operator not working使用按位运算符的 DataColumn 类不起作用
【发布时间】:2014-01-03 13:44:05
【问题描述】:

我有一个 DataColumn 实现来在运行时评估表达式。令我惊讶的是,DataColumn 操作似乎不支持按位运算符。

需要检查单个位组或位组。例子:

(Value & 0x0002) 检查第二位设置。应返回 true (1)。

((Value & 0x000F) == 0x03) 检查 Value 的前 4 位是否为 3。

有没有办法使用 DataColumn 类来支持这些按位运算?

是否有支持按位运算的 DataColumn 替代方案?

关于如何使用常用数学运算符的建议?

[编辑 - 完整的功能代码]

public static bool EvaluateExpression(string expression, object value, out object returnValue, out string errorMessge)
{
    try
    {
        errorMessge = String.Empty;

        ///
        /// First substitute the references of object with its value
        /// 
        string evalExpression = expression.Replace("[this]", Convert.ToString(value));

        ///
        /// Now evaluate the expression
        /// 
        DataTable loDataTable = new DataTable();

        double dummyResult;
        DataColumn loDataColumn;

        if (Double.TryParse(evalExpression, out dummyResult))
            loDataColumn = new DataColumn("Eval", typeof(double), evalExpression);
        else
            loDataColumn = new DataColumn("Eval", typeof(string), evalExpression);

        loDataTable.Columns.Add(loDataColumn);
        loDataTable.Rows.Add(0);

        returnValue = (object) loDataTable.Rows[0]["Eval"];

        return true;
    }
    catch (Exception e)
    {
        errorMessge = e.Message.ToString();
        returnValue = 0;
        return false;
    }
}

在示例中调用函数...

.
.
.
.
object val = (object) 12538;

string errorMsg = String.Empty;

object result;

string expr = "[this] & 0x02";

if (!EvaluateExpression (expr, val, result, errorMsg))
{
    Console.WriteLine("Error on expression. Error = " + errorMsg);
}
else
{
    Console.WriteLine("The resulting valur is " + val.ToString();
}

【问题讨论】:

  • 我们可以再看一些代码吗?
  • 如何设置Value?什么是Value
  • 已发布代码。除了我现在需要支持的按位运算符之外,该函数在一段时间内对所有常见的数学运算都可以正常工作。 [this] 更改为给定值。价值只是为了说明一些价值。
  • 来吧,发布的代码甚至没有尝试按位运算。
  • 对您的不理解深表歉意。按位运算在运行时构建。喜欢:EvaluateExpression ("[this] & 0x03", (object) 12, our result, out error)...这就是为什么原始问题不包含代码...

标签: c# math datacolumn


【解决方案1】:

【讨论】:

  • 这就是我现在发现的。因此,我需要使用数学运算符或其他方法来更改它。有什么建议吗?
  • 你为什么要为此使用 DataColumn 类?也许你应该尝试这样的事情:stackoverflow.com/questions/826398/…
  • 原因是代码非常简单,没有额外的库。 C# 解析器要复杂得多,我真的只需要支持简单的操作,而不是语言解析器。我们前段时间做过,效果很好。问题是现在我需要支持按位,它不支持......我需要一个简单的方法......
【解决方案2】:

根据@sdf,它们不支持按位运算,但可以使用可用的运算符模拟一些按位运算。例如:

  • [this] & 0x02 等价于 IIF(Convert([this]/2, 'System.Int32')%2 = 0, 0, 2)
  • [this] | 0x02 等价于 IIF(Convert([this]/2, 'System.Int32')%2 = 0, [this] + 2, [this])
  • [this] >> 2 等价于 Convert([this]/4, 'System.Int32')
  • [this] << 2 等价于 Convert([this]*4, 'System.Int32')

【讨论】:

  • +This 但是 OP 必须在将字符串填充到 DataColumn 之前解析字符串并获取他将使用的操作并替换这些操作。在他解析字符串以获取操作符号时,获取 args 并将其传递给执行此操作的本机代码函数可能很简单。也许这就是他从一开始就应该做的事情?
  • 是的,当然,除非可以修改原始字符串。他没有说它是从哪里来的……
  • 现在可以解决我的问题,但我预见我需要设计一个支持按位的新解析器。我正在查看linklink 之类的帖子。最后一个看起来完整且可定制,但需要一些时间。关于值,表达式由用户配置,值来自数据库数据。我以前不知道它,因为每个用户都会有差异表达式,运行实时数据库数据......
  • 不工作。当我们执行 [this]/2 时,它会将其转换为 double,不能将其模块化为 2。因此它会引发异常...
  • 您是否尝试过转换,如上图所示?然而,解析器并不难,而且绝对是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2022-06-21
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多