c#使用字符串

时间:2016-10-23 13:42:36

标签: c# replace foreach contains

我正在学习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);                                       
}

现在这段代码完全按照我在数组中输入的字样输出,没有任何变化。那么这里的问题是什么?

4 个答案:

答案 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)

每当您对字符串数据类型执行任何操作时,它都会创建一个新字符串,您必须将其存储在新变量中。