Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';拆分字符串列表以匹配首字母和末字母的最佳方法是什么?_C#_String_List_Lookup_Ilookup - Fatal编程技术网

C# 什么';拆分字符串列表以匹配首字母和末字母的最佳方法是什么?

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” 我发现这种拆分方法非常快速,使每个项目都独一

我有一个很长的C#单词列表,我想找到该列表中的所有单词,它们的首字母和末字母相同,长度在5到7个字符之间。例如,该列表可能有:

“浪费是洗是洗看着手表因浪费而枯萎机智的洗涤”

它会回来的

长度:5-7,第一个字母:w,最后一个字母:d,“浪费,清洗,观看” 长度:5-7,第一个字母:w,最后一个字母:s,“洗涤,手表,枯萎,废物”

然后我可能会更改长度为3-4个字符的规范,这将返回

长度:3-4,第一个字母:w,最后一个字母:s,“was,wits”

我发现这种拆分方法非常快速,使每个项目都独一无二,使用了长度,并提供了一个良好的开端:

有没有办法修改/使用它来考虑第一个字母和最后一个字母

编辑

我最初问过“最快”的方法,因为我通常用很多字符串数组(它们速度慢,涉及很多代码)来解决这样的问题。LINQ和查找对我来说是新的,但是我可以看到我链接到的解决方案中使用的ILookup非常简单,速度非常快。我实际上不需要最短的处理器时间。任何避免我为这些信息创建单独数组的方法都是非常好的。

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