根据与目标字符串的差异对字符串列表进行排序的最佳方法?

时间:2009-03-25 10:16:17

标签: c# .net sorting collections

我需要根据列表中的字符串和目标字符串之间的差异对List进行排序。

实现这种排序算法的最佳方法是什么?

我对性能并不太在意,但收藏可能会变得很大(让我们说50万个上衣)。

感谢任何帮助!

2 个答案:

答案 0 :(得分:10)

我建议计算Levenshtein distance,然后按整数结果排序。 (Magic code

public void Example()
{
    string target = "target";

    List<string> myStings = new List<string>();

    myStings.Add("this");
    myStings.Add("that");

    myStrings = myStrings.OrderBy(each => Levenshtein(each, target)).ToList();
}

public int Levenshtein(string stringA, string stringB)
{
    // Magic goes here
    return 0;
}

没有OrderBy的老skool 2.0家伙?

List<string> myStrings;
myStrings.Sort(LevenshteinCompare);
...

public class LevenshteinCompare: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Magic goes here
    }
}

答案 1 :(得分:1)

  

实现这种排序算法的最佳方法是什么?

说谎,我建议使用quicksort的库实现,与目标字符串的距离作为排序键。

这当然不是一个有用的答案。为什么不?因为你真正想知道的是“字符串有什么好的差异指标?”

真正的问题的答案,遗憾的是,“它取决于”;这取决于你关心的距离属性。

话虽如此,请阅读Levenstein距离及其对弦乐的真实说法。

您可以通过调整动态编程矩阵中不同步骤的权重来修改基本算法,以使度量偏向于长期运行中出现的相同字符。

您还可以使用Soundex算法,该算法说明哪些字符串听起来相似(但最适合短字符串;我不知道您使用的是哪种输入)。

如果字符串长度相等,您还可以使用汉明距离(计算字符串不同的索引数)。通过计算(单方面)不存在的索引总是不同的,可以推广到某些东西,这给你一些类似Levenstein的东西(有点'sorta'可能)。

简短版本:取决于。我已经给出了一些意见,但是如果没有你的更多信息,我不能说哪个对你来说是个好的决定