使用过多的布尔值

时间:2011-09-19 19:44:29

标签: c#

有更好的方法吗?

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。为了简洁而修剪它。

4 个答案:

答案 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,但可能不是您真正想要的 - 您可能需要CurrentCultureIgnoreCaseInvariantCultureIgnoreCase

(请注意,为了执行不区分大小写的比较,下层字符串是一个坏主意 - 特别是如果您只是使用默认语言环境来执行此操作。例如,如果您使用小写“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);