גישה לאינדקס של מחרוזת

יש לי תקלה בשפת C#.
התוכנית:

string Key = Console.ReadLine();
for(int i=0; i < Key.Length; i++) {
	if (Key[i] = "e") {
		Key[i] = "z";
	}
}

יש למישהו מושג איך לתקן את זה?

אופרטור שווה יחיד “=” הוא אופרטור השמה בשפת C#. זה בדיוק כמו שניסית להשתמש במקרה Key[i]="z". בפקודה המותנית (תנאי ה-if) אתה צריך להשוואות תנאי ולכן אתה צריך להשתמש באופרטור שמחזיר ערך בוליאני (ובפרט באופרטור “==”). אולם גם שינוי זה לא יתקן את התוכנית. המשתנה Key הוא מטיפוס מחרוזת (String) ואילו הליטרל "e" הוא מטיפוס תו (char). כל פעם שאתה ניגש לאינדקס כלשהו במחרוזת, יוחזר ערך מטיפוס תו ולא מחרוזת. לכן אתה צריך לעטוף את הליטרל בעזרת גרש יחיד, כלומר 'e' במקום "e". אותו הדבר גם עבור השורה Key[i]='z'. עד כאן השינויים הם:

string Key = Console.ReadLine();
for(int i=0; i < Key.Length; i++) {
	if (Key[i] == 'e') {
		Key[i] = 'z';
	}
}

אולם גם זה לא יעזור שכן מחרוזות בשפת C# לא ניתנות לשינוי (נקראות immutable). אם תנסה להכניס תו חדש לאחד האינדקסים של המחרוזות אתה תקבל את השגיאה הבאה:

Property or indexer ‘string.this[int]’ cannot be assigned to — it’s read only

למעשה, אם נסתכלה-API הציבורי, ניתן למצוא:

public char this[int index] { get; }

במקום זאת, אתה תצטרך לבנות מחרוזת חדשה עם השינוי שאתה מעוניין לבצע. ישנן מספר דרכים לקבל התנהגות כזאת. כך לדוגמה, ניתן להשתמש ב-StringBuilder בדרך דומה שניסית.

מקווה שמובן :slight_smile:

לייק 1