我正在学习c#,我正在做一些练习。我被要求制作一个程序,制作一系列字符串并删除元音形成它的单词 我做了这个代码来删除元音" S"但它没有用。有人可以帮助我吗?
string[] musicinst = new string[4] { "cello", "guitar", "violin", "double bass" };
foreach (string s in musicinst)
{
if (s.Contains("s")) { s.Replace("s", ""); }
Console.WriteLine(s);
}
现在这段代码完全按照我在数组中输入的字样输出,没有任何变化。那么这里的问题是什么?
答案 0 :(得分:4)
.Replace
不会更改字符串,但会返回带有更改的新字符串。您现在需要将其分配回s:
if (s.Contains("s"))
{
s = s.Replace("s", "o");
}
现在这也不起作用:
无法分配给's',因为它是'foreach迭代变量'
因此,请使用for
循环并通过索引器访问或创建新列表并将s.Replace
的结果添加到其中:
string[] musicinst = new string[4] { "cello", "guitar", "violin", "double bass" };
var newData = musicinst.Select(item => item.Replace("s", "o")).ToArray();
如果您在不敏感时需要处理更换,请查看: Is there an alternative to string.Replace that is case-insensitive?
答案 1 :(得分:3)
您正在遇到名为immutability的C#字符串功能 - 对字符串的操作不会更改字符串,它会返回一个新字符串。鉴于此,您可能认为需要这样做:
s = s.Replace("s", "o");
但那不会起作用,因为''是一个foreach迭代器。你最好的选择是重新制作你的循环:
for (int i = 0; i < musicinst.Length; ++i)
{
if (musicinst[i].Contains("s"))
{
musicinst[i] = musicinst.Replace("s", "o");
}
}
哪个会在原地改变你的阵列。为了保持数组的不变性,您可以考虑使用类似LINQ的选项来构建新数组,正如其他人已经演示过的那样。
答案 2 :(得分:2)
static void Main(string[] args)
{
string[] musicinst = new string[4] { "cello", "guitar", "violin", "double bass" };
char[] vowels = new char[5] { 'a', 'e', 'i' ,'o', 'u' };
List<string> output = new List<string>();
foreach (string s in musicinst)
{
string s1 = s;
foreach (var v in vowels)
{
if (s1.Contains(v))
{
s1=s1.Remove(s1.IndexOf(v),1);
}
}
output.Add(s1);
}
Console.ReadLine();
}
答案 3 :(得分:0)
每当您对字符串数据类型执行任何操作时,它都会创建一个新字符串,您必须将其存储在新变量中。