сравнение строк, возвращает наиболее похожие

#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. ? Это будет работать с моим алгоритмом. Фактически строка поиска будет иметь три совпадения и потенциально будет первой. Решение, помеченное как правильное, даже не найдет его…