【问题标题】:Property or indexer cannot be assigned to :: string2[i] = sting1[i]属性或索引器不能分配给 :: string2[i] = sting1[i]
【发布时间】:2013-11-26 00:53:36
【问题描述】:
using System;

namespace stringdouble
{
    public class populate
    {
        public string string1;
        public string string2;

        public populate (string string1 ,string string2)
        {
            for (int i=1; i < string1.Length; i++)
            {
                if (string1[i] == string1[i-1])
                {
                    string2[i] = string1[i];//error on this line
                    Console.WriteLine ("Character Copied");
                    Console.ReadKey();
                    Console.Clear();
                }
            }

            Console.WriteLine (string2);
        }
    }

这是代码,但由于某种原因,它给了我上面输入的错误。我正在尝试删除字符串中的重复项并将它们复制到一个新的中。

我叫这个new populate(FirstString, SecondString);

【问题讨论】:

  • 字符串在C# 中是不可变的。结果是创建新字符串。
  • 那些属性不能像只读一样改变
  • 与你问的无关,但是为什么类必须公开未使用的字段string1;string2;,而构造函数public populate (string string1 ,string string2)接受两个同名参数但从不分配给字段?

标签: c#


【解决方案1】:

字符串是不可变的,因此一旦创建它们就不能在不创建新字符串的情况下修改它们。这就是为什么当您尝试从字符串修改字符时出现异常的原因。

您可以使用 Linq 仅获取唯一字符:

string uniqueCharacters = new string(string1.Distinct().ToArray());

或者,如果你想要一个新字符串中的所有重复字符:

var dupChars = string1.GroupBy(c => c)
   .Where(g => g.Count() > 1)
   .Select(g => g.First());
string dupliateCharacters = new string(dupChars.ToArray());

正如 BartozKP 所提到的,也许您想创建一个由相等的相邻字符组成的字符串。这是使用StringBuilder 和循环的可能实现:

public string Populate(string text)
{
    StringBuilder sb = new StringBuilder();
    if(text.Length > 1)
    {
        for (int i = 1; i < text.Length; i++)
        { 
            Char c = text[i];
            if (c == text[i - 1])
                sb.Append(c);
        }
    }
    return sb.ToString();
}

【讨论】:

    【解决方案2】:

    您可以使用String#ToCharArray() 将字符串转换为字符数组。 在您的代码中:

    char[] chars1 = string1.ToCharArray();
    ....
    string result = new string(chars);
    

    【讨论】:

    • 使用StringBuilder 还可以按索引设置单独的char 值,如myStringBuilder[7] = 'y';,但它还有许多其他不错的字符串功能,所以他可能更喜欢它通过一个简单的char[] 数组。这个数组有很多限制,一个是它有固定的长度。
    【解决方案3】:

    string 是 .NET Framework 中 String 的别名。 .NET String 是不可变的。使 string2 成为 StringBuilder 类的对象,以使您的代码正常工作。

    【讨论】:

      【解决方案4】:

      不具备实际功能的工作版本:

      public class populate
      {
          public populate (string string1 ,string string2)
          {
              char[] result = string2.ToCharArray();
      
              for (int i=1; i < string1.Length; i++)
              {
                  if (string1[i] == string1[i-1])
                  {
                      result[i] = string1[i];
                      Console.WriteLine ("Character Copied");
                      Console.ReadKey();
                      Console.Clear();
                  }
              }
      
              string2 = new string(result);
      
              Console.WriteLine (string2);
          }
      

      基于 HimBromBeere 提供的答案。但是,这不会从string1 中删除所有重复项。如果您真的想这样做,请参考 TimSchmelter 的回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多