C # Найти как строки в массиве - PullRequest
0 голосов
/ 02 июля 2018

Вопрос: У меня есть массив строк, и я пытаюсь найти наиболее близкое соответствие с указанной строкой. Ниже я сделал несколько попыток, а также проверил некоторые другие решения, такие как расстояние Левенштейна, которое, кажется, работает, только если все строки имеют одинаковые размеры.

Expetation: Если бы я использовал «два лучше», так как строка соответствия будет соответствовать «Два лучше, чем один».

мысль: Мне было интересно, было бы полезно вообще разбить строку stringToMatch, где есть пробелы, а затем посмотреть, найдена ли каждая из этих частей строки stringToMatch в текущей итерации массива (arrayOfStrings [i])?

// Test array and string to search
string[] arrayOfStrings = new string[] { "A hot potato", "Two are better than one", "Best of both worlds", "Curiosity killed the cat", "Devil's Advocate", "It takes two to tango", "a twofer" };
string stringToMatch = "two are better";


// Contains attempt
List<string> likeNames = new List<string>();
for (int i = 0; i < arrayOfStrings.Count(); i++)
{
    if (arrayOfStrings[i].Contains(stringToMatch))
    {
        Console.WriteLine("Hit1");
        likeNames.Add(arrayOfStrings[i]);                    
    }

    if (stringToMatch.Contains(arrayOfStrings[i]))
    {
        Console.WriteLine("Hit2");
        likeNames.Add(arrayOfStrings[i]);
    }
}


// StringComparison attempt
var matches = arrayOfStrings.Where(s => s.Equals(stringToMatch, StringComparison.InvariantCultureIgnoreCase)).ToList();



// Display matched array items
Console.WriteLine("List likeNames");
likeNames.ForEach(Console.WriteLine);

Console.WriteLine("\n");

Console.WriteLine("var matches");
matches.ForEach(Console.WriteLine);

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Для вашей реализации я разделил stringToMatch, а затем взял количество совпадений.

Приведенный ниже код предоставит вам список заказов с количеством заказов с наибольшим количеством совпадений строк.

string[] arrayOfStrings = new string[] { "A hot potato", "Two are better than one", "Best of both worlds", "Curiosity killed the cat", "Devil's Advocate", "It takes two to tango", "a twofer" };
            string stringToMatch = "two are better";

            var matches = arrayOfStrings
                  .Select(s =>
                  {
                      int count = 0;
                      foreach (var item in stringToMatch.Split(' '))
                      {
                          if (s.Contains(item))
                              count++;
                      }
                      return new { count, s };
                  }).OrderByDescending(d => d.count);

Я использовал очень простое сравнение строк для проверки. Алгоритм может варьироваться в зависимости от точного требования (например, последовательность совпадающей строки и т. Д.)

0 голосов
/ 02 июля 2018

Вы можете попробовать код ниже.

Я создал List<string> на основе вашего stringToMatch и проверил, содержит ли строка в array из strings каждую строку, присутствующую в toMatch, если да, то выбрал эту строку в match.

List<string> toMatch = stringToMatch.Split(' ').ToList();
List<string> match = arrayOfStrings.Where(x => 
                                   !toMatch.Any(ele => !x.ToLower()
                                   .Contains(ele.ToLower())))
                                   .ToList();
...