大家好, 我是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 }
是否可以执行此操作? (将条件变量的内容替换为字符串变量吗?
答案 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 ")))
...然后,您所描述的是一个函数,该函数以一个IDataReader
或SqlDataReader
作为参数,并返回一个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)))
想象一下,如果我们有条件来确定要应用哪些条件。那可能会变成一种巨大的丑陋状况。但是用变量表示单个条件可以使它们更易于管理。它使我们可以将选择条件的步骤与检查条件的步骤分开。