大家好的一天,我是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 ")))
...那么您所描述的是将IDataReader
或SqlDataReader
作为参数的函数,并返回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)))
想象一下,如果我们有条件我们要应用哪个条件。这可能会变成一个巨大的丑陋状况。但是,用变量代表个人条件可以使它们更易于管理。它使我们能够将选择条件的步骤从检查它们的步骤中分开。