Я пишу приложение, которое проверяет некоторые города. Часть проверки проверяет, находится ли город в списке, сопоставляя код страны и имя города (или имя города).Самый быстрый способ сравнить объекты в C#
Я храню мой список существующих городов, как:
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()?
EDIT
Я забыл опубликовать свою функцию, как():
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()) + ".");
}
Я считаю, что ваша самая большая проблема с производительностью связана с оператором 'Like', что дорого. Не можете ли вы просто использовать сопоставитель равенства? –
Можете ли вы показать нам, как вы называете этот метод сравнения слишком –
Я бы рекомендовал против этого сделать это в памяти по нескольким причинам. Во-первых, потому что вы уже видите очевидные проблемы с производительностью с этим механизмом, но во-вторых, потому что вы храните много информации в памяти строго для целей поиска. Это правильно подходит для сервера базы данных, и затраты на кругооборот очень незначительны. –