有更好的方法吗?
foreach (var line in lines)
{
bool t01 = line.Model.ToLower() == model;
bool t02 = line.Authority.ToLower() != "unknown";
bool t101 = line.Type.ToLower() == "adcn";
bool t102 = line.Type.ToLower() == "adcn/adv";
bool t103 = line.Type.ToLower() == "bn";
bool t104 = line.Type.ToLower() == "book";
bool t105 = line.Type.ToLower() == "cancel";
bool t106 = line.Type.ToLower() == "cir";
bool t107 = line.Type.ToLower() == "coord sht";
bool t108 = line.Type.ToLower() == "cre";
bool t109 = line.Type.ToLower() == "ddr";
bool t110 = line.Type.ToLower() == "dl";
if (t01 && t02)
if ((t101 || t102 || t103 || t104 || t105 || t106 || t107 || t108 || t109 || t110))
Console.WriteLine(line);
}
它实际上升到t139。为了简洁而修剪它。
答案 0 :(得分:14)
听起来你需要HashSet<string>
类型:
static readonly HashSet<string> ValidTypes = new HashSet<string>
(StringComparer.OrdinalIgnoreCase)
{
"adcn", "adcn/adv", "bn" ...
};
if (line.Model.Equals(model, StringComparison.OrdinalIgnoreCase) &&
!line.Authority.Equals("unknown", StringComparison.OrdinalIgnoreCase) &&
validTypes.Contains(line.Type))
{
Console.WriteLine(line);
}
这也比单独比较每个项目的字符串更快。请注意,虽然我在上面使用了OrdinalIgnoreCase
,但可能不是您真正想要的 - 您可能需要CurrentCultureIgnoreCase
或InvariantCultureIgnoreCase
。
(请注意,为了执行不区分大小写的比较,下层字符串是一个坏主意 - 特别是如果您只是使用默认语言环境来执行此操作。例如,如果您使用小写“MAIL”并且您当前的区域设置是土耳其语,您不会获得“邮件”。)
答案 1 :(得分:2)
string[] validTypes = new string[] { "adcn", "adcn/adv", "bn", "book" /*, ...*/ };
foreach (var line in lines)
{
bool t01 = line.Model.ToLower() == model;
bool t02 = line.Authority.ToLower() != "unknown";
if(t01 && t02 && validTypes.Contains(line.Type.ToLower())
Console.WriteLine(line);
}
答案 2 :(得分:0)
您可以使用BitArray
或只是简单的LINQ
var types = new List<string>{ "adcn", "adcn/adv" }; // etc
if (types.Any(t => t == line.Type.ToLower()))
{
Console.WriteLine(line);
}
考虑你的例子:
var types = new List<string>{ "adcn", "adcn/adv" }; // etc
foreach (var line in lines)
{
if (types.Any(t => t == line.Type.ToLower()))
{
Console.WriteLine(line);
}
}
或者
var types = new List<string>{ "adcn", "adcn/adv" }; // etc
foreach (var line in lines.Where(line => types.Any(t => t == line.Type.ToLower())))
{
Console.WriteLine(line);
}
答案 3 :(得分:0)
你的意思是什么?在我的脑海中,您正在评估139个条件,然后将该行写入控制台(如果其中任何一个为真)。如果第一个(或第三个,或第四个等)是真的而没有考虑其余部分,那么短路会更有效。
您可以通过将评估函数存储在列表中来完成此操作:
var cases = new List<Func<Line>>();
cases.Add(l => l.Model.ToLower() == model); //Be careful of the closure here
cases.Add(l => l.Authority.ToLower() != "unknown");
... etc ...
然后按顺序评估函数,如果当前函数返回true,则提前退出:
if (cases.Any(c=>c(line)))
Console.WriteLine(line);