C# 什么';拆分字符串列表以匹配首字母和末字母的最佳方法是什么?
我有一个很长的C#单词列表,我想找到该列表中的所有单词,它们的首字母和末字母相同,长度在5到7个字符之间。例如,该列表可能有: “浪费是洗是洗看着手表因浪费而枯萎机智的洗涤” 它会回来的 长度:5-7,第一个字母:w,最后一个字母:d,“浪费,清洗,观看” 长度:5-7,第一个字母:w,最后一个字母:s,“洗涤,手表,枯萎,废物” 然后我可能会更改长度为3-4个字符的规范,这将返回 长度:3-4,第一个字母:w,最后一个字母:s,“was,wits” 我发现这种拆分方法非常快速,使每个项目都独一无二,使用了长度,并提供了一个良好的开端: 有没有办法修改/使用它来考虑第一个字母和最后一个字母 编辑 我最初问过“最快”的方法,因为我通常用很多字符串数组(它们速度慢,涉及很多代码)来解决这样的问题。LINQ和查找对我来说是新的,但是我可以看到我链接到的解决方案中使用的ILookup非常简单,速度非常快。我实际上不需要最短的处理器时间。任何避免我为这些信息创建单独数组的方法都是非常好的。C# 什么';拆分字符串列表以匹配首字母和末字母的最佳方法是什么?,c#,string,list,lookup,ilookup,C#,String,List,Lookup,Ilookup,我有一个很长的C#单词列表,我想找到该列表中的所有单词,它们的首字母和末字母相同,长度在5到7个字符之间。例如,该列表可能有: “浪费是洗是洗看着手表因浪费而枯萎机智的洗涤” 它会回来的 长度:5-7,第一个字母:w,最后一个字母:d,“浪费,清洗,观看” 长度:5-7,第一个字母:w,最后一个字母:s,“洗涤,手表,枯萎,废物” 然后我可能会更改长度为3-4个字符的规范,这将返回 长度:3-4,第一个字母:w,最后一个字母:s,“was,wits” 我发现这种拆分方法非常快速,使每个项目都独一
var minLength=5;
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();
var maxLength=7;
var firstPart=“w”;
var lastPart=“d”;
var words=新列表{“wash”,“wash”};//等等
var matches=words。其中(w=>w.Length>=minLength&&w.Length就在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();
}
void Main()
{
var words=新[]{“浪费”、“被浪费”、“被清洗”、“被清洗”、“被清洗”、“被观察”、“手表”、“萎蔫”、“被浪费”、“被清洗”、“被清洗”};
var firstLetter=“w”;
var lastLetter=“d”;
var最小长度=5;
var最大长度=7;
var sortedWords=words.Where(w=>w.StartsWith(firstLetter)和&w.EndsWith(lastLetter)和&w.Length>=最小长度和&w.Length这一行将为您提供范围内第一个/最后一个字母相同的组
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()});
intmin=5;
int max=7;
var results=str.Split()
其中(s=>s.Length>=min&s.Length new{First=s.First(),Last=s.Last()});
这里有一个方法可以完全满足您的要求。您只得到字符串列表和最小/最大长度,对吗?您没有得到要筛选的第一个和最后一个字母。此方法处理字符串中的所有第一个/最后一个字母
private static void ProcessInput(string[] words, int minLength, int maxLength)
{
var groups = from word in words
where word.Length > 0 && word.Length >= minLength && word.Length <= maxLength
let key = new Tuple<char, char>(word.First(), word.Last())
group word by key into @group
orderby Char.ToLowerInvariant(@group.Key.Item1), @group.Key.Item1, Char.ToLowerInvariant(@group.Key.Item2), @group.Key.Item2
select @group;
Console.WriteLine("Length: {0}-{1}", minLength, maxLength);
foreach (var group in groups)
{
Console.WriteLine("First letter: {0}, Last letter: {1}", group.Key.Item1, group.Key.Item2);
foreach (var word in group)
Console.WriteLine("\t{0}", word);
}
}
private static void ProcessInput(字符串[]个字,int minLength,int maxLength)
{
变量组=单词中的单词
当word.Length>0&&word.Length>=minLength&&word.Length只是一个简单的想法时,我不知道这是否会比发布的linq解决方案更快或更有效,但使用正则表达式也可以相当容易地做到这一点
例如,如果您希望获得以“w”开头、以“s”结尾的5-7个字母长度的单词,您可以使用以下模式:
\bw[A-Za-z]{3,5}s\b
(这可以很容易地变得更加可变-例如,为第一个字母、最小长度、最大长度、最后一个字母设置一个变量,并将它们插入到模式中以替换w、3、5和s)
使用正则表达式库,您可以将捕获的组作为列表
同样,我不知道这与linq的效率相比如何,但我认为这可能值得一提
希望这有帮助!!可能有。你的问题是什么,你想让我们为你编写代码吗?“最快”?Pfft。为什么不使用Where然后使用GroupBy?现代CPU非常快;在编写完成任务的代码后,分析它是否需要“更快”。Where/GroupBy方法在复杂性方面也非常有效。我不知道什么会更快,因为我看到人们发布的大多数答案都涉及Linq,但另一种选择可能是正则表达式……感谢反馈,我已经修改了它,去掉了“最快”一词,并且我已经解释了我试图在上面说的内容。但你不需要o运行676(26*26)使用不同的正则表达式来确保获得所有匹配项,并且需要某种分组逻辑。运行所有正则表达式的开销会降低性能。这是一个令人惊讶的解决方案。另外一个问题:如何将其推广到一系列长度?因此,不要只做5个最小值和7个最小值作为最大值,它还可以执行6和8、7和9等操作,因为它可以处理整个单词列表?@user3473853:如果您的单词长度限制是不相交的(即5-7、8-10等),则您可以扩展答案以构建嵌套分组。如果长度限制重叠(即5-7、6-8、7-9),则您必须通过多个查询来执行此操作。
private static void ProcessInput(string[] words, int minLength, int maxLength)
{
var groups = from word in words
where word.Length > 0 && word.Length >= minLength && word.Length <= maxLength
let key = new Tuple<char, char>(word.First(), word.Last())
group word by key into @group
orderby Char.ToLowerInvariant(@group.Key.Item1), @group.Key.Item1, Char.ToLowerInvariant(@group.Key.Item2), @group.Key.Item2
select @group;
Console.WriteLine("Length: {0}-{1}", minLength, maxLength);
foreach (var group in groups)
{
Console.WriteLine("First letter: {0}, Last letter: {1}", group.Key.Item1, group.Key.Item2);
foreach (var word in group)
Console.WriteLine("\t{0}", word);
}
}
\bw[A-Za-z]{3,5}s\b