C#关键字查找排序问题

metheonline 2017-07-08 10:30:05
List<string> list = new List<string>();           
list.Add("Zhangsan");
list.Add("LisiZhangsan");
list.Add("Zhangsi");
list.Add("张三");
list.Add("李四");
list.Add("王五");
list.Add("王六");
list.Add("Lisi");
list.Add("zhang");


输入zhang,查询结果为:
zhang
Zhangsan
LisiZhangsan

这个怎么实现好呢?
...全文
255 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2017-07-08
  • 打赏
  • 举报
回复
        static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("Zhangsan");
list.Add("LisiZhangsan");
list.Add("Zhangsi");
list.Add("张三");
list.Add("李四");
list.Add("王五");
list.Add("王六");
list.Add("Lisi");
list.Add("zhang");

var s = "zhang";
var r = list.FindAll(x => x.ToLower().Contains(s.ToLower())).OrderBy(x=>LevenshteinDistance(x,s));
Console.WriteLine(string.Join("\r\n", r));
}
        //最小编辑距离
public static int LevenshteinDistance(string s1, string s2)
{
if (s1 == s2)
return 0;
else if (String.IsNullOrEmpty(s1))
return s2.Length;
else if (String.IsNullOrEmpty(s2))
return s1.Length;

var m = s1.Length + 1;
var n = s2.Length + 1;
var d = new int[m, n];

// Step1
for (var i = 0; i < m; i++) d[i, 0] = i;

// Step2
for (var j = 0; j < n; j++) d[0, j] = j;

// Step3
for (var i = 1; i < m; i++)
{
for (var j = 1; j < n; j++)
{
var cost = s1[i - 1] == s2[j - 1] ? 0 : 1;

var deletion = d[i - 1, j] + 1;
var insertion = d[i, j - 1] + 1;
var substitution = d[i - 1, j - 1] + cost;

d[i, j] = Math.Min(Math.Min(deletion, insertion), substitution);
}
}

return d[m - 1, n - 1];
}
metheonline 2017-07-08
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
用linq的Select函数,再orderby一下。
orderby 一下 LisiZhangsan就排到前面去了,要保持张三在前面
exception92 2017-07-08
  • 打赏
  • 举报
回复
用linq的Select函数,再orderby一下。
metheonline 2017-07-08
  • 打赏
  • 举报
回复
这样好像也可以 list.Where(x => x.Contains(keyword)).OrderBy(x => x.IndexOf(keyword)).Take(10).ToArray() 我想知道还有其他更好的办法吗?

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧