使用字符串变量作为if句子的参数



大家好的一天,我是C#上的新手,我只想知道是否可以将带有条件的字符串传递给if句子。

类似以下内容:

String strEnviosCondicion = "!(drFilaMovimientos["EMISOR"].ToString().Contains("CRUDO") ||" +
                                                        "drFilaMovimientos["EMISOR"].ToString().Contains("MEZCLA ")) && " +
                                                        "(drFilaMovimientos["RECEPTOR"].ToString().Contains("CRUDO") ||" +
                                                        "drFilaMovimientos["RECEPTOR"].ToString().Contains("MEZCLA ")))";
 if (strEnviosCondicion)
 { Do Something }

否则在C#上写完整的Sentece

if (!(drFilaMovimientos["EMISOR"].ToString().Contains("CRUDO") ||
                                  drFilaMovimientos["EMISOR"].ToString().Contains("MEZCLA ")) && 
                                (drFilaMovimientos["RECEPTOR"].ToString().Contains("CRUDO") ||
                                 drFilaMovimientos["RECEPTOR"].ToString().Contains("MEZCLA ")))
                            {  Do Something }

有没有办法执行此操作?(替换字符串变量的条件内容?

这是不可能的,通常,在这样的字符串中存储代码并不理想出于多种原因(性能,可读性,重构,重复使用,安全性,...(。/p>

字符串是如何生成的?我想这将来自某种数据结构,例如drfrilakeys和搜索器(或可能来自这些(,在这种情况下,您最好以编程方式表达表达式。

eg:

var drFrilaKeys = new string[] { "EMISOR", "RECEPTOR" };
var searchTerms = new string[] { "CRUDO", "MEZCLA" };
var allDrFilaMovimientosContainASearchTerm = drFrilaKeys.All(key => searchTerms.Any(searchTerm =>
    drFilaMovimientos[key].ToString().Contains(searchTerm)
));
if (allDrFilaMovimientosContainASearchTerm) {
 // Code here
}

其他想法

如果您要在数据库中存储(例如(过滤器或类似的过滤器,则最好以一种格式存储(例如JSON(,并将其格式化为代码中的布尔条件 - 我强烈建议您不建议您不要使用生产代码中的任何形式的评估。(注意 - 我通常不建议将JSON存储在关系数据库中,但是对于某些有限的灵活数据,您不想直接查询,这可能是一个不错的选择。当然,比在我的我的心灵(。

看起来您想要的是一个函数。

bool EnviosCondicion() {
    return !(drFilaMovimientos["EMISOR"].ToString().Contains("CRUDO")
        || drFilaMovimientos["EMISOR"].ToString().Contains("MEZCLA "))
        && (drFilaMovimientos["RECEPTOR"].ToString().Contains("CRUDO")
        || drFilaMovimientos["RECEPTOR"].ToString().Contains("MEZCLA "));
}
if (EnviosCondicion()) {
    do something;
}

如果您要测试不同值的不同字符串,则可以在函数中添加参数。

bool EnviosCondicion(string emisor, string receptor) {
    return !(emisor.Contains("CRUDO") || emisor.Contains("MEZCLA"))
         && (receptor.Contains("CRUDO") || receptor.Contains("MEZCLA"));
}
if (EnviosCondicion(drFilaMovimientos["EMISOR"], drFilaMovimientos["RECEPTOR"])) {
    do something;
}

如果要将函数分配给变量,则可以做到这一点。该变量不是string。这将是Func

如果这是您的病情:

if (!(drFilaMovimientos["EMISOR"].ToString().Contains("CRUDO") ||
                              drFilaMovimientos["EMISOR"].ToString().Contains("MEZCLA ")) && 
                            (drFilaMovimientos["RECEPTOR"].ToString().Contains("CRUDO") ||
                             drFilaMovimientos["RECEPTOR"].ToString().Contains("MEZCLA ")))

...那么您所描述的是将IDataReaderSqlDataReader作为参数的函数,并返回bool,表明条件是真实或错误的。(我猜是从dr。(

这将表示为Func<SqlDataReader, bool>。这是将SqlDataReader作为参数并返回bool的函数。

Func<SqlDataReader, bool> condition = (dr) => 
    !(drFilaMovimientos["EMISOR"].ToString().Contains("CRUDO") ||
                          drFilaMovimientos["EMISOR"].ToString().Contains("MEZCLA ")) && 
                        (drFilaMovimientos["RECEPTOR"].ToString().Contains("CRUDO") ||
                         drFilaMovimientos["RECEPTOR"].ToString().Contains("MEZCLA "));

或者您可以声明变量并为其分配一种方法:

Func<SqlDataReader, bool> condition = SomeCondition; 
// SomeCondition is a method with the same signature as the Func.

然后使用

if(condition(dataReader)) 

如果您可能想应用一种条件,或者您可能想应用其他条件,那可能很方便。您可以具有Func变量,为其分配一个或另一个函数,然后使用该函数。

,就像其他任何变量一样,您可以将Func作为方法参数传递。因此,假设您有一个SqlDataReader,您想首先建立一个条件列表,然后检查它们是否都是真实的。对于数据读取器而言,此示例有点笨拙,但是用于插图:

var conditions = new List<Func<SqlDataReader, bool>>();
// we could add various conditions to this list:
// See if all of the conditions are true
if(conditions.All(condition => condition(reader)))

想象一下,如果我们有条件我们要应用哪个条件。这可能会变成一个巨大的丑陋状况。但是,用变量代表个人条件可以使它们更易于管理。它使我们能够将选择条件的步骤从检查它们的步骤中分开。