gpt4 book ai didi

c# - 替代if,else if

转载 作者:可可西里 更新时间:2023-11-01 03:11:43 26 4
gpt4 key购买 nike

我有很多 if, else if 语句,我知道必须有更好的方法来做到这一点,但即使在搜索 stackoverflow 之后,我也不确定在我的特定情况下该怎么做。

我正在解析文本文件(账单)并根据某些字符串是否出现在账单上将服务提供商的名称分配给变量 (txtv​​ar.Provider)。

这是我正在做的事情的一小部分(别笑,我知道这很乱)。总而言之,大约有 300 个 if,else if。

if (txtvar.BillText.IndexOf("SWGAS.COM") > -1)
{
txtvar.Provider = "Southwest Gas";
}
else if (txtvar.BillText.IndexOf("georgiapower.com") > -1)
{
txtvar.Provider = "Georgia Power";
}
else if (txtvar.BillText.IndexOf("City of Austin") > -1)
{
txtvar.Provider = "City of Austin";
}
// And so forth for many different strings

我想使用 switch 语句之类的东西来提高效率和可读性,但我不确定如何比较 BillText。我正在寻找类似这样的东西,但不知道如何让它发挥作用。

switch (txtvar.BillText)
{
case txtvar.BillText.IndexOf("Southwest Gas") > -1:
txtvar.Provider = "Southwest Gas";
break;
case txtvar.BillText.IndexOf("TexasGas.com") > -1:
txtvar.Provider = "Texas Gas";
break;
case txtvar.BillText.IndexOf("Southern") > -1:
txtvar.Provider = "Southern Power & Gas";
break;
}

我绝对乐于接受想法。

我需要能够确定评估值的顺序。可以想象,在解析数百种略有不同的布局时,我偶尔会遇到这样的问题,即没有关于账单所属服务提供商的明确唯一指示符。

最佳答案

为什么不使用 C# 提供的所有功能?以下对匿名类型、集合初始值设定项、隐式类型变量和 lambda 语法 LINQ 的使用是紧凑、直观的,并且维护了按顺序评估模式的修改要求:

var providerMap = new[] {
new { Pattern = "SWGAS.COM" , Name = "Southwest Gas" },
new { Pattern = "georgiapower.com", Name = "Georgia Power" },
// More specific first
new { Pattern = "City of Austin" , Name = "City of Austin" },
// Then more general
new { Pattern = "Austin" , Name = "Austin Electric Company" }
// And for everything else:
new { Pattern = String.Empty , Name = "Unknown" }
};

txtVar.Provider = providerMap.First(p => txtVar.BillText.IndexOf(p.Pattern) > -1).Name;

更有可能的是,模式对来自可配置的来源,例如:

var providerMap =
System.IO.File.ReadLines(@"C:\some\folder\providers.psv")
.Select(line => line.Split('|'))
.Select(parts => new { Pattern = parts[0], Name = parts[1] }).ToList();

最后,正如@millimoose 指出的那样,匿名类型在方法之间传递时用处不大。在那种情况下,我们可以定义一个简单的 Provider 类,并使用对象初始化器来实现几乎相同的语法:

class Provider { 
public string Pattern { get; set; }
public string Name { get; set; }
}

var providerMap =
System.IO.File.ReadLines(@"C:\some\folder\providers.psv")
.Select(line => line.Split('|'))
.Select(parts => new Provider() { Pattern = parts[0], Name = parts[1] }).ToList();

关于c# - 替代if,else if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com