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

时间:2019-05-09 16:56:27

标签: c#

大家好, 我是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#上必须写完整的句子

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

是否可以执行此操作? (将条件变量的内容替换为字符串变量吗?

3 个答案:

答案 0 :(得分:2)

这是不可能的,并且通常由于许多原因(性能,可读性,重构,重用,安全性等),将代码存储在这样的字符串中并不理想。

如何生成字符串?我想它会来自某种数据结构,例如drFrilaKeys和searchTerms(或者可能来自这些),在这种情况下,您最好以编程方式表达该表达式。

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存储在关系数据库中,但是对于某些不希望直接查询的有限灵活数据,这是一个不错的选择。肯定比在我的计算机中存储C#字符串要好。头脑)。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果要将函数分配给变量,则可以执行此操作。该变量就不会是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来指示条件为true或false。 (我猜是从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)))

想象一下,如果我们有条件来确定要应用哪些条件。那可能会变成一种巨大的丑陋状况。但是用变量表示单个条件可以使它们更易于管理。它使我们可以将选择条件的步骤与检查条件的步骤分开。