【问题标题】:C# Find Like Strings In ArrayC#在数组中查找类似的字符串
【发布时间】:2018-07-02 06:36:07
【问题描述】:

问题: 我有一个字符串数组,我正在尝试找到与提供的字符串最接近的匹配项。我在下面做了一些尝试,并检查了其他一些解决方案,例如 Levenshtein Distance,这似乎只有在所有字符串都具有相似大小的情况下才有效。

期望: 如果我使用“两个更好”作为匹配字符串,它将与“两个比一个更好”匹配。

想法: 我想知道是否在有空格的地方拆分 stringToMatch 字符串,然后查看在数组的当前迭代( arrayOfStrings[i] )中是否找到了 stringToMatch 字符串的每个部分是否会有所帮助?

// 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);

【问题讨论】:

  • 所以你想要一个字符串距离算法,它可以很好地处理不同长度的字符串,并且可以帮助你更好地确定(或给出更接近的分数)其中一个是否是子字符串?...这是不太适合stackoverflow。有无数种不同的字符串距离算法出于不同的原因做许多不同的事情。也许您需要仔细研究他们每个人的工作并研究它们之间可用的比较。我之所以这么说是因为这里有很多期望的结果在您的问题中并不明显,而且确实无法回答跨度>

标签: c# arrays sorting compare string-comparison


【解决方案1】:

你可以试试下面的代码。

我根据您的stringToMatch 创建了List&lt;string&gt;,并检查了stringsarray 中的字符串是否包含toMatch 中存在的每个字符串,如果是,则将该字符串选择到match

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

【讨论】:

  • 这在尝试匹配以空格分隔的部分字符串时效果很好。我将此与 Levenshtein 的方法结合起来,以提供一个备份选项,以防用户拼错了他输入的字符串的所有子部分。感谢发帖!
  • @Pie 乐于助人
【解决方案2】:

对于您的实现,我已经拆分了 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);

我使用了非常简单的字符串比较来验证。该算法可以根据具体要求而变化(如匹配字符串的序列等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 2011-03-20
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多