比如有一句话:白日依山尽。
从数据库查出来后5条记录,但顺序乱了,比如:
[zi] [yin]
尽 jin
日 ri
依 yi
白 bai
山 shan
除了逐字处理的方式,有没有可能通过Linq或一句SQL让它按照某一句话中字的顺序排序的功能?
数据库中表只有汉字和拼音两个字段,查询条件是一串汉字,即一句话,希望查出来的结果也按传入的这句话排序。因为这一句话可能很长,超过5000字
需求不够明确,你的数据库里面是啥记录?或者是我的理解力有问题?
汉字和拼音两个字段,查询条件是一串汉字
@沧海一杰:
看了你另外一贴,大概知道你想干啥了。
这个方法我暂时不知道。
不过我不建议你用这个方法实现你的解决方案,我的意思是你的解决方案是有问题的。
解决了这问题也没有用。
说几点理由吧。
1、汉字拼音,不需要用查字典的方式,微软有个库可以支持传入一个汉字,返回这个汉字所有拼音。
2、你用这个方法是用Where 5000个字.contains(汉字字段) 这样查询是吗?这个效率也不会高的。
而且SQL查询字符串是有长度限制的。
3、你要用空间来换时间的话,就要把这5000个字先处理一下,放在数据库里面,每个字都有一个顺序号,还有一个选择好的拼音(多音字,在UI上显示多个,管理员选择其中一个后,保存在数据库里面)
就是说,字段是三个, 一个是汉字,一个是拼音,一个是顺序号。这样你查询的时候,就可以按照顺序号排序了。
或者就是选好的所有拼音连在一起放一个字段之类的。(看你其他的需求决定)
@爱编程的大叔: 1.这个是一定要查数据库的,因为微软提供的拼音库获取不到声调。而且我这里有很多字是并不是取自常用的新华字典,而是直接注意康熙字典里的这字,这些字一般的字典都查不到,我不认为可以通过微软的库获取到正确的读音。即使以上的问题都能通过微软的库解决,但考虑到有些情况要自定义,让拼音是可控的,所以暂时不考虑使用微软的库。2.时间换空间,我不认为你的方法能提高效率。至于5000个不能一次性传入数据库,但我可以分一百次查询不就可以了吗?每个汉字都是查询关键字呀,当然重复的不算,这个字一定是要传入数据库的。现在数据库中汉字列就是主键。
@沧海一杰:
1、微软的拼音库是可以获取到声调的,不知道谁告诉你获取不到。当然,如果你要用自己的字典,也不反对。你这问的是两个问题,我认为重点是第二个问题,至于怎么查一个汉字的拼音,相对于第二个问题来说,确实不重要。
2、不知道你要做啥,你觉得行就行好了。这个问题是解决方案的重点,你需求还是没有明确,我只是觉得你可能走错的方向,不过每个人面对的问题不同,掌握的知识面不同,所以有可能你的方案是对的也说不定。
@爱编程的大叔: 如果可以获取声调,我再试试,我拿到的代码居然获取不到,它用1,2,3,4,5来表示声调。这种就太烂,我要可以直接和拼音一起显示的。我也希望微软的这个库可以把我拼音问题解决了,因为我的文章可能还牵扯到自动断词断句和通过词典进行中文注释,所以查词典是难免的,词典里的拼音我是可以自己维护的。
@沧海一杰:
建议你看看最新有一篇文章,讲界面与数据分离的。
你好象一直把界面与数据两个概念合并了。
首先,拼音取得是数据,至于你要怎么显示,那是UI。
@爱编程的大叔: 因为拼音对我来说是不可控的,我总不能再去研究声调是怎么注上去的。拼音应该是单一的,只由一个元素组成,如果一个字“白”得到的拼音是"bai","2",这里的2代表声调二声,我还要判断音调是要注到哪个字母上面,判断出来后,那么如何把2注到bai中的a上面呢?这些问题会应运而生。应该是能直接获取到的就是:bái,我就不用处理上述问题了。
@沧海一杰:
拼音标注的方法 http://iask.sina.com.cn/b/20864901.html
你把好多问题全部搅在一起了,按照你这样的话,变成你要存储
白 <----> bái
你可能就是希望在UI上可以直接显示bái,但为了UI,你牺牲了数据的灵活性了。(可能这么说不一定对)
但是感觉上,你真的是把数据和UI混在一起了。
@爱编程的大叔: 或许吧,最主要的是功能,分层与我如浮云,不关心。
string s = "白日依山尽"; var ar = new[] { "尽", "日", "依", "白", "山" }; //利用字典处理好传入的顺序 var dic = new Dictionary<string, int>(); for (var i = 0; i < s.Length; i++) { var ch = s[i].ToString(CultureInfo.InvariantCulture); if (!dic.ContainsKey(ch)) { dic.Add(ch, i); } } //利用自定义排序规则排序 Array.Sort(ar, (a, b) => dic[a] - dic[b]);
以上是一段模拟代码,没有处理重复的汉字。
最后一句还可以换换,如下:
Array.Sort(ar, (a, b) => s.IndexOf(a, StringComparison.Ordinal) - s.IndexOf(b, StringComparison.Ordinal));
跟一楼说的一样`.你要把一个5000个汉字长度的数据也就是1mb的数据穿到数据库去做查询条件`.你当SQL是神啊``
这样搞你这系统不用运行了``别走这个思路了.换个别的方案吧`
顶一楼
学习了!