【问题标题】:C# Can't get char from string property [closed]C#无法从字符串属性中获取字符[关闭]
【发布时间】:2021-02-14 04:41:54
【问题描述】:

我有一个从字符串字段接收字符串值的类的属性。我需要检查属性的字符串值的前两个 char 值是否与数组中一组字符串的前两个 char 值相等或不同。然后如果没有匹配,我需要替换属性接收到的字符串的前 2 个字符

因此,在我的例子中:我决定使用属性 BookID来自类 Book)从该属性接收的字符串中读取第一个字符,并进行比较它与数组 categoryCodes 中每个字符串的第一个字符。如果第一个字符都不匹配(这是我卡住的地方),我需要将属性 BookID 具有的字符串的前 2 个字符替换为 'M ' 和我'。老实说,我遇到了一个完全不理解的错误,并花了几个小时试图解决它,但我不知道。 帮助!求救

class Book
    {
        public static string[] categoryCodes = {"CS", "IS", "SE", "SO", "MI"};
        public static string[] categoryNames = { "Computer Science", "Information System", "Security", "Society", "Miscellaneous" };

        private string bookId;
        private string categoryNameOfBook;

        public string BookTitle { get; set; }
        public int NumOfPages { get; set; }
        public double Price { get; set; }

        public string BookID
        {
            get { return bookId; }
            set
            {                
                bookId = value;
                CategoryCheckSet();
            }
        }
        public string CategoryNameOfBook
        {
            get { return categoryNameOfBook; }            
        }

        private void CategoryCheckSet()
        {            
            if (BookID[0] != categoryCodes[0][0] 
                && BookID[0] != categoryCodes[1][0] 
                && BookID[0] != categoryCodes[2][0] 
                && BookID[0] != categoryCodes[2][0] 
                && BookID[0] != categoryCodes[3][0])
            {
                BookID[0] = categoryCodes[4][0]; //ERROR HERE: BookID[0], MESSAGE: Property 'string.this[int]' cannot be assigned to -- it is read only
            }
        }
    }

我在这里做错了什么? 我可以仅通过使用属性本身来访问 Property 内的 string 吗? 如何替换 Property 接收的 string 中的特定字符?

提前谢谢你。

【问题讨论】:

  • 你可能有一个 XY 问题.....
  • @MitchWheat 我不明白你的评论。 'XY' 问题......??
  • BookID 不是数组,我处理它的想法类似于 string temp = BookID; BookID = $"{categoryCodes[4][0]}{temp.Substring(2)}" 您也可以考虑将 BookID[0] 更改为 BookID.Substring(0,2)

标签: c# arrays properties char


【解决方案1】:

string indexer只读,这意味着您不能通过其索引器设置字符

public char this[int index] { get; }

更长的故事

字符串是不可变的(一个不可改变的对象)和Interned

Interning 只是一种奇特的说法,即字符串存储在表中,每个不同的字符串值只有一个副本,以减少分配。很容易理解为什么 string 需要是 immutable。能够设置 indexer 或更改它会导致各种奇怪的问题。


您需要将BookID 转换为char 数组,然后将ToCharArray 转换为Concat,或者使用String.Substring 或C# 8 范围表示法 并通过其他方式重建string

从此实例中检索子字符串。子字符串开始于 指定字符位置并继续到字符串的末尾。

var chars = BookID.ToCharArray();
chars[0] = categoryCodes[4][0];
BookID = string.Concat(chars);

// or

BookID = categoryCodes[4][0] + BookID.Substring(1);

// or if you like interpolation 

BookID = $"{categoryCodes[4][0]}{BookID.Substring(1)}"

// or if you like C# 8 ranges

BookID = categoryCodes[4][0] + BookID[1..]

【讨论】:

  • 绝对同意,您不能使用索引器更改字符串中的字符,您需要使用 string.Replace() 或创建一个以新字符开头的新字符串并将其余部分添加到其中上一个...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多