我正在编写一个验证某些城市的应用程序。验证的一部分是通过匹配国家代码和城市名称(或替代城市名称)来检查城市是否已经在列表中。
我将现有的城市列表存储为:
public struct City
{
public int id;
public string countrycode;
public string name;
public string altName;
public int timezoneId;
}
List<City> cityCache = new List<City>();
然后我有一个包含国家代码和城市名称等的位置字符串列表。我拆分这个字符串,然后检查城市是否已经存在。
string cityString = GetCity(); //get the city string
string countryCode = GetCountry(); //get the country string
city = new City(); //create a new city object
if (!string.IsNullOrEmpty(cityString)) //don't bother checking if no city was specified
{
//check if city exists in the list in the same country
city = cityCache.FirstOrDefault(x => countryCode == x.countrycode && (Like(x.name, cityString ) || Like(x.altName, cityString )));
//if no city if found, search for a single match accross any country
if (city.id == default(int) && cityCache.Count(x => Like(x.name, cityString ) || Like(x.altName, cityString )) == 1)
city = cityCache.FirstOrDefault(x => Like(x.name, cityString ) || Like(x.altName, cityString ));
}
if (city.id == default(int))
{
//city not matched
}
这对于很多记录来说非常慢,因为我也在以同样的方式检查其他对象,如机场和国家。有什么办法可以加快速度吗?这种比较有没有比 List<> 更快的集合,有没有比 FirsOrDefault() 更快的比较函数?
编辑
我忘了发布我的 Like() 函数:
bool Like(string s1, string s2)
{
if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s2))
return s1 == s2;
if (s1.ToLower().Trim() == s2.ToLower().Trim())
return true;
return Regex.IsMatch(Regex.Escape(s1.ToLower().Trim()), Regex.Escape(s2.ToLower().Trim()) + ".");
}