Empecé a intentar aprender c#.
No entiendo por qué mi uso de Array.IndexOf(); devuelve -1. Quiero que devuelva los números de índice en el alphabet en función de las letras en un nombre de player_name que obtiene de la entrada del usuario. Estoy tratando de recorrer los caracteres del nombre del player_name y capturar el número de índice de ese carácter en el alfabeto.
Echar un vistazo:
using System; namespace FantasyGame { internal class Program { static void Main(string[] args) { string player_name = null; string[] alphabet = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å" }; Console.Write("\nEnter your name: "); player_name = Console.ReadLine(); string[] password = { }; foreach (char c in player_name) { int index = Array.IndexOf(alphabet, c); Console.WriteLine(Array.IndexOf(alphabet, c)); Console.WriteLine(c); } } } } Si reemplazo la variable c con un valor de cadena específico como "k" , devuelve el número de índice correcto. ¿Por qué? La ´´´c´´´ tiene un valor de cadena, ¿verdad?
La
ctiene un valor de cadena, ¿verdad?
No, tiene un valor char . Puedes ver eso donde has declarado la variable:
foreach (char c in player_name) Hay numerosas correcciones para esto. Sugeriría que lo más simple es hacer que el alphabet sea una cadena y usar string.IndexOf . Alternativamente, para mantener su código lo más similar posible, haga que el alphabet sea char[] , por ejemplo, usando String.ToCharArray :
char[] alphabet = "abcdefghijklmnopqrstuvwxyzæøåabcdefghijklmnopqrstuvwxyzæøå".ToCharArray();Tu c no es un valor de string , es un char
Reemplazar
int index = Array.IndexOf(alphabet, c);con
int index = Array.IndexOf(alphabet, c.ToString());ver los documentos oficiales ,
el alphabet es una matriz de cadenas, por lo que debemos pasar una cadena al segundo parámetro de Array.IndexOf
Esto sucede porque está comparando "c", que es de tipo Char con una letra del alfabeto que es de tipo String . Lo que puede hacer es simplemente cambiar el tipo de matriz que está utilizando a Char[] de esta manera.
char[] alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'æ', 'ø', 'å', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'æ', 'ø', 'å' };También preste atención a las comillas en las que los tipos char usan comillas simples ' ' pero los tipos string usan comillas dobles " " .
La documentación de MSDN de Array.IndexOf() dice
Busca el objeto especificado y devuelve el índice de su primera aparición en una matriz unidimensional o en un rango de elementos de la matriz.
Ahora en tu código,
Si observa de cerca, su matriz alphabet es una matriz de string
su código int index = Array.IndexOf(alphabet, c) está tratando de encontrar el valor de char Unicode en una cadena alfabética y es por eso que obtiene -1 como resultado.
Para que funcione, el tipo de alphabet y el tipo de c deben ser iguales. Lo mismo en el sentido, si el alfabeto es un char[] entonces c debería ser char.
Puedes conseguirlo de dos formas,
alphabet como una matriz de charc en cadena.Primer enfoque,
char[] alphabet = "abcdefghijklmnopqrstuvwxyzæøåabcdefghijklmnopqrstuvwxyzæøå".ToCharArray(); int index = Array.IndexOf(alphabet, c); //here alphabet is a type of char arraysegundo enfoque,
string[] alphabet = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "æ", "ø", "å" }; int index = Array.IndexOf(alphabet, c.ToString());