在字符串集合中查找最相同的字符串

时间:2012-05-11 09:11:20

标签: c# string collections

我有一个包含所有系统字体名称的列表。以下是列表的一部分:

Arial
Calibri
Times New Roman

我的问题是:我有16个ASCII字符(2个字节)的fontname字体(粗体,斜体,常规)

Calibri Bold
Arial Bold Itali
Times New Roman 

如果我有一个字符串(例如Arial Bold Itali),如何从列表中获取字体名称(例如Arial)

希望有人可以帮助我或给我建议。

答案: 我做了反之亦然。打赌这可以让我更有效率,但它现在有效。

foreach (string fn in FontHelper.FontNames)
        {
          if (Font.FontName.Contains(fn))
          {
            fontname = fn;
            break;
          }
        }

6 个答案:

答案 0 :(得分:3)

您可以尝试使用Levenshtein距离。找到大多数相同的字符串是件好事。 here你可以阅读它,你也可以找到一些算法来找到那个距离。

答案 1 :(得分:2)

您可以使用.contains()方法

string str = "Arial Bold Itali";

if(str.contains("Arial"))
{
   return str;
}

答案 2 :(得分:1)

我的建议是,在进行匹配之前去掉字体修饰符。我假设字体只有几种不同的修饰符。

var fontToFind = "Arial Bold Itali";

fontToFind = fontToFind.Replace("Bold", "").Replace("Itali", "").Trim();

//Do search

答案 3 :(得分:1)

假设“最相同”意味着一个是另一个的前缀,你可以这样做:

var fonts = new[] { "Arial", "Calibri", "Times New Roman" };

var input = new[] { "Calibri Bold", "Arial Bold Itali", "Times New Roman" };

var result = input.Select(item => fonts.Single(font => item.StartsWith(font)));
// result == { "Calibri", "Arial", "Times New Roman" }

答案 4 :(得分:1)

你需要某种启发式方法 - 例如,删除任何“Bold”和“Italic”后缀(我真的不知道还能遇到什么)。

可以使用正则表达式完成:

var str = "Arial Bold Italic";
var fontName = Regex.Replace(str, "((Bold|Italic)\\s*)*$", String.Empty);

<强> See it in action

另外,您可以非常轻松地扩展它以去除更多后缀,例如“Oblique”。

答案 5 :(得分:1)

我认为你也可以使用开头。

string str = "Arial Bold Itali";

if(str.StrartWith("Arial"))
{
   return str;
}