检查字符串数组中的单词是否以char结尾和开头,并在它们之间插入新字符串(c#)

检查字符串数组中的单词是否以char结尾和开头,并在它们之间插入新字符串(c#),c#,string,linq,list,cycle,C#,String,Linq,List,Cycle,如果条件为true,如何在两个字符串之间插入字符串 假设我们有一个字符数组,我们要检查第一个单词是否以其中一个字符结尾,第二个单词是否以其中一个字符开头 例如,“回家”将通过条件,因为“o”和“h”是符合要求的字母(=>回家) char[]toCheck={'h','o','d','g'}; 字符串句子=“回家”; 列表单词=句子.Split(“”).ToList(); for(int i=0;ix==words[i][words[i].Length-1])&& (toCheck.Any(x=>

如果条件为true,如何在两个字符串之间插入字符串

假设我们有一个字符数组,我们要检查第一个单词是否以其中一个字符结尾,第二个单词是否以其中一个字符开头

例如,“回家”将通过条件,因为“o”和“h”是符合要求的字母(=>回家)

char[]toCheck={'h','o','d','g'};
字符串句子=“回家”;
列表单词=句子.Split(“”).ToList();
for(int i=0;ix==words[i][words[i].Length-1])&&
(toCheck.Any(x=>x==words[i+1][0]))
{
字。插入(i,“_”);
}
}
返回单词。聚合(“,(当前,单词)=>当前+(单词+”);

我的问题是,这是返回“在家之间”而不是“在家之间”,我不知道为什么


谢谢您的帮助。

请考虑以一种非常直接的方式将结果语句存储在一个新的
字符串中:

char[] toCheck = { 'h', 'o', 'd', 'g' };
string sentence = "Go home";

string finalsentence = "";

List<string> words = sentence.Split(' ').ToList();
for (int i = 0; i < words.Count - 1; i++) {
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) &&
         (toCheck.Any(x => x == words[i + 1][0]))) {
             finalsentence = words[i] + "_between" + words[i + 1] + " ";
    }
}

return finalsentence;
“我的问题是,这又回到了“家与家之间”,而不是“家与家之间”,我不知道为什么。”

因为你的我索引在
单词中从0开始。您可以通过多种方式更改代码,但基于您的问题,如果您想保留代码,请不要使用
words.Insert(i,“\u-between”)对于i==0


希望这有帮助…

这里有一个方法可以用来返回一个单词序列,而不是插入到原始集合中

private static IEnumerable<string> InsertBetween(
    this IList<string> words, 
    char[] characters, 
    string insertValue)
{
    for (int i = 0; i < words.Count - 1; i++)
    {
        yield return words[i];
        if (characters.Contains(words[i].Last()) && characters.Contains(words[i + 1][0]))
            yield return insertValue;
    }

    if (words.Count > 0)
        yield return words[words.Count - 1];
} 
我会给你

往返于家与家之间

我只是认为最好避免对循环中的collection进行变异,但是如果你这样做了,你需要在插入时增加索引,这样你就超过了插入值,你必须插入到正确的位置

for (int i = 0; i < words.Count - 1; i++)
{
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) &&
        (toCheck.Any(x => x == words[i + 1][0])))
    {
        words.Insert(i + 1, "_between");
        i++;
    }
}
for(int i=0;ix==words[i][words[i].Length-1])&&
(toCheck.Any(x=>x==words[i+1][0]))
{
插入(i+1,“_之间”);
i++;
}
}

你可以做
x==words[i].Last()
而不是
x==words[i][words[i].Length-1]
,因为我更容易阅读。并使用
返回string.Join(“,words)
用于将单词重新组合在一起。在
if
条件中,添加
i>0&
。这会让你恢复健康的。如果
,请确保它是
中的第一个条件。或者,更好的是,将
for
循环更改为
for(int i=1;i
。由于您永远不希望
\u-between
在第一个单词之前,因此从1开始循环。问题是
单词的长度将不断增加,因为您正在向其添加值。最好不要因为这个原因而改变正在循环的集合。或者最好是
StringBuilder
@juharr或
string.Join
。)当插入一个单词时,
i
需要递增,或者如果其中一个字符是插入单词中的最后一个字母,则会导致无限循环。@对于第二种方法(使用
Insert
),juharr观察得非常好。更新。非常感谢!最后,这个方法最适合我的情况,所以我接受它作为一个答案。
private static IEnumerable<string> InsertBetween(
    this IList<string> words, 
    char[] characters, 
    string insertValue)
{
    for (int i = 0; i < words.Count - 1; i++)
    {
        yield return words[i];
        if (characters.Contains(words[i].Last()) && characters.Contains(words[i + 1][0]))
            yield return insertValue;
    }

    if (words.Count > 0)
        yield return words[words.Count - 1];
} 
char[] toCheck = { 'h', 'o', 'd', 'g' };
string sentence = "Go home";
Console.WriteLine(string.Join(" ", sentence.Split().InsertBetween(toCheck, "_between")));
for (int i = 0; i < words.Count - 1; i++)
{
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) &&
        (toCheck.Any(x => x == words[i + 1][0])))
    {
        words.Insert(i + 1, "_between");
        i++;
    }
}