C# 使用太多布尔值

C# 使用太多布尔值,c#,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

有更好的方法吗

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。为简洁起见,请将其剪短。

您可以使用

或者只是普通林克

var types = new List<string>{ "adcn", "adcn/adv" }; // etc
if (types.Any(t => t == line.Type.ToLower()))
{
     Console.WriteLine(line);
}
var types=新列表{“adcn”,“adcn/adv”};//等
if(types.Any(t=>t==line.Type.ToLower())
{
控制台写入线(行);
}
考虑到你的例子:

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=新列表{“adcn”,“adcn/adv”};//等
foreach(行中的var行)
{
if(types.Any(t=>t==line.Type.ToLower())
{
控制台写入线(行);
}
}
或许

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);
}
var types=新列表{“adcn”,“adcn/adv”};//等
foreach(line.Where(line=>types.Any(t=>t==line.Type.ToLower())中的var行)
{
控制台写入线(行);
}
您可以使用

或者只是普通林克

var types = new List<string>{ "adcn", "adcn/adv" }; // etc
if (types.Any(t => t == line.Type.ToLower()))
{
     Console.WriteLine(line);
}
var types=新列表{“adcn”,“adcn/adv”};//等
if(types.Any(t=>t==line.Type.ToLower())
{
控制台写入线(行);
}
考虑到你的例子:

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=新列表{“adcn”,“adcn/adv”};//等
foreach(行中的var行)
{
if(types.Any(t=>t==line.Type.ToLower())
{
控制台写入线(行);
}
}
或许

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);
}
var types=新列表{“adcn”,“adcn/adv”};//等
foreach(line.Where(line=>types.Any(t=>t==line.Type.ToLower())中的var行)
{
控制台写入线(行);
}

听起来您需要一个用于以下类型的
HashSet

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);
}
static readonly HashSet ValidTypes=新HashSet
(StringComparer.OrdinalIgnoreCase)
{
“adcn”、“adcn/adv”、“bn”。。。
};
if(line.Model.Equals(Model,StringComparison.OrdinalIgnoreCase)&&
!line.Authority.Equals(“未知”,StringComparison.OrdinalIgnoreCase)&&
validTypes.Contains(line.Type))
{
控制台写入线(行);
}
这也比单独比较每个项目的字符串要快。请注意,尽管我在上面使用了
ordinallingorecase
,但这可能不是您真正想要的-您可能想要
CurrentCultureInogoreCase
InvariantCultureInogoreCase


(请注意,为了执行不区分大小写的比较,使用小写字符串是一个坏主意-尤其是如果您只是使用默认区域设置来进行比较。例如,如果您使用小写“MAIL”,而当前区域设置为土耳其语,则不会得到“MAIL”。

听起来您需要一个
哈希集来处理以下类型:

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);
}
static readonly HashSet ValidTypes=新HashSet
(StringComparer.OrdinalIgnoreCase)
{
“adcn”、“adcn/adv”、“bn”。。。
};
if(line.Model.Equals(Model,StringComparison.OrdinalIgnoreCase)&&
!line.Authority.Equals(“未知”,StringComparison.OrdinalIgnoreCase)&&
validTypes.Contains(line.Type))
{
控制台写入线(行);
}
这也比单独比较每个项目的字符串要快。请注意,尽管我在上面使用了
ordinallingorecase
,但这可能不是您真正想要的-您可能想要
CurrentCultureInogoreCase
InvariantCultureInogoreCase


(请注意,为了执行不区分大小写的比较,降低大小写字符串的大小写是一个坏主意-特别是如果您只是使用默认区域设置来进行比较。例如,如果您使用小写“MAIL”,而您当前的区域设置是土耳其语,则不会得到“MAIL”。

您所说的更好是什么意思?在我的脑海中,您正在评估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 ...

你说的更好是什么意思?在我的脑海中,您正在评估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 ...

您需要将此发送给。重新思考您如何解决手头的问题。@Luwe:除非它在C#tag中,否则Jon Skeet将始终回答。:)您应该使用string.Compare(“,”,StringComparison.CurrentCultureInoRecase)而不是ToLower来进行字符串比较。您需要将此发送给。重新考虑如何解决手头的问题。@Luwe:除非它在C标记中,否则Jon Skeet将始终回答。:)您应该使用string.Compare(“,”,StringComparison.CurrentCultureInoRecase)而不是ToLower进行字符串比较这不会减少if语句中的比较数量这不会减少if语句中的比较数量虽然我的(现在已接受)答案是一个很好的快速修复方法,可以完成这项工作,我必须听从乔恩·斯基特的回答,才能找到合适的解决办法。他的回答更彻底,效率也高出几个数量级。虽然我(现在被接受)的答案是一个很好的快速解决方案,但我必须遵从Jon Skeet的答案,以找到合适的解决方案。他的回答要彻底得多,效率也要高出几个数量级。