#c# #string #entity-framework #comparison
#c# #строка #entity-framework #сравнение
Вопрос:
Найдите подстроки из строки и получите подстроку, которая соответствует наибольшему количеству!
string [] allModels = { "Galaxy", "S3", "Galaxy S3" };
string title = "Samasung galaxy s3 is for sale";
string[] title_array = title.Split(' ');
string model = "";
foreach(var tit in title_array)
{
foreach(var mod in allModels)
{
if (mod.Equals(tit, StringComparison.OrdinalIgnoreCase))
{
model = mod;
}
}
}
Выбранная модель Galaxy
мне нужна Galaxy S3
(т.Е. Наиболее похожа). Как я могу получить Galaxy S3
.
Должен ли я использовать Array.FindAll(target)
метод?
Обновить:
Я имею в most similar
виду подстроку (модель), которая больше всего соответствует строке (названию)
например, в galaxy Samasung s3 is for sale
модели должно быть galaxy s3
(согласно приведенному выше allModels
массиву)
Ответ №1:
Most similar?
не обязательно Search substrings from a string and get a substring that matches the most!
, я предполагаю, что вам нужно самое длинное совпадение…
string[] allModels = { "Galaxy", "S3", "Galaxy S3" };
string title = "Samasung galaxy s3 is for sale";
var mod = allModels.OrderByDescending(x => x.Length)
.FirstOrDefault(x => title.IndexOf(x,StringComparison.OrdinalIgnoreCase)>=0);
Комментарии:
1.
allModels
не содержит определения дляLength
. Ошибка2. @IrfanWattoo Скопируйте код правильно, я не использую длину для
allModels
BTW: я запускаю приведенный выше код перед публикацией 🙂3. извините за мою ошибку, что, если заголовок похож
galaxy Samasung s3 is for sale
. в этом случае код работать не будет4. @IrfanWattoo Исправляет, что это не так. Итак, перечитайте мое первое предложение и определите свою функцию подобия (оба ваших слова) ….
5. Вы можете использовать
.Contains
метод вместоIndexOf()>=0
, но он не принимаетStringComparison.OrdinalIgnoreCase
. Поэтому вы должны преобразовать обе строки в нижний / верхний, прежде чем использоватьContains
BTW: Ваш вопрос не был связанEntity Framework
с. Пожалуйста, используйте правильные теги….
Ответ №2:
Вот способ найти модель, содержащую наибольшее количество слов в названии.
var allModelsList = new List<String>(allModels);
var titles = new List<String>(title_array);
allModelsList.OrderByDescending(model => titles.Where(title => title.Equals(model, StringComparison.OrdinalIgnoreCase)).Count()).FirstOrDefault();
Комментарии:
1. пожалуйста, ознакомьтесь с обновленным вопросом. Что, если нам нужно найти
Galaxy S5 Neo
изSamsung Galaxy Neo S5 for sale
2. ? Это будет работать с моим алгоритмом. Фактически строка поиска будет иметь три совпадения и потенциально будет первой. Решение, помеченное как правильное, даже не найдет его…