我有很多if,else if语句,我知道必须有更好的方法来做到这一点,但是即使在搜索stackoverflow之后,我也不确定在我的特定情况下如何这样做。
我正在解析文本文件(票据),并根据帐单上是否出现某些字符串,将服务提供者的名称分配给变量(txtvar.Provider)。
这只是我正在做的一小部分(不要笑,我知道这很麻烦)。总而言之,如果有,则大约为300。
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指出的那样,在方法之间传递时,匿名类型的用处较小。在那种情况下,我们可以定义一个trivalProvider
类,并使用对象初始化程序来实现几乎相同的语法:
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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句