我在C#中有一个很长的单词列表,我想在这个列表中找到所有的单词,这些单词具有相同的首字母和最后字母,长度在5到7个字符之间。例如,列表可能有:
浪费的东西被洗了,洗了就洗了,看着手表枯萎了,浪费了智慧的洗涤
它会回来的
长度: 5-7,第一个字母: w,最后一个字母: d,“浪费,清洗,观看”长度: 5-7,第一个字母: w,最后一个字母: s,“洗涤,手表,枯萎,废物”
然后,我可能会更改长度为3-4个字符的规范,这将返回
长度: 3-4,第一个字母: w,最后一个字母: s,"was,wits“
我发现这种分割方法非常快,使每个项目都是唯一的,使用了长度,并给出了一个很好的开始:Spliting string into words length-based lists c#
是否有一种方法来修改/使用它来考虑到第一个字母和最后一个字母?
编辑
我最初问的是“最快”的方法,因为我通常用很多字符串数组来解决类似的问题(这些字符串数组很慢,涉及大量代码)。LINQ和查找对我来说是新的,但是我可以看到,在我链接到的解决方案中使用的ILookup在简单性和速度上都是惊人的。我其实不需要最小的处理器时间。任何避免我为这些信息创建单独数组的方法都是非常棒的。
发布于 2014-03-28 19:13:27
这一条线将给你在你的范围内第一个/最后一个字母相同的组。
int min = 5;
int max = 7;
var results = str.Split()
.Where(s => s.Length >= min && s.Length <= max)
.GroupBy(s => new { First = s.First(), Last = s.Last()});
发布于 2014-03-28 19:11:31
var minLength = 5;
var maxLength = 7;
var firstPart = "w";
var lastPart = "d";
var words = new List<string> { "washed", "wash" }; // so on
var matches = words.Where(w => w.Length >= minLength && w.Length <= maxLength &&
w.StartsWith(firstPart) && w.EndsWith(lastPart))
.ToList();
在大多数情况下,这应该是足够快的,除非你正在处理成千上万的文字和担心的ms。然后我们可以再看一看。
发布于 2014-03-28 19:12:29
就在LINQPad中,我创建了以下内容:
void Main()
{
var words = new []{"wasted", "was", "washed", "washing", "was", "washes", "watched", "watches", "wilts", "with", "wastes", "wits", "washings"};
var firstLetter = "w";
var lastLetter = "d";
var minimumLength = 5;
var maximumLength = 7;
var sortedWords = words.Where(w => w.StartsWith(firstLetter) && w.EndsWith(lastLetter) && w.Length >= minimumLength && w.Length <= maximumLength);
sortedWords.Dump();
}
如果速度不够快,我将创建一个查找表:
Dictionary<char, Dictionary<char, List<string>> lookupTable;
并做:
lookupTable[firstLetter][lastLetter].Where(<check length>)
https://stackoverflow.com/questions/22721050
复制相似问题