检查字符串数组中的单词是否以char结尾和开头,并在它们之间插入新字符串(c#)
如果条件为true,如何在两个字符串之间插入字符串 假设我们有一个字符数组,我们要检查第一个单词是否以其中一个字符结尾,第二个单词是否以其中一个字符开头 例如,“回家”将通过条件,因为“o”和“h”是符合要求的字母(=>回家)检查字符串数组中的单词是否以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=>
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++;
}
}