.net string .net-2.0

.net - Dividir los enteros de la cadena



string .net-2.0 (13)

Fragmento de código final que toma lo que espero sea el mejor de todas las sugerencias:

Function GetIDs(ByVal IDList As String) As List(Of Integer) Dim SplitIDs() As String = IDList.Split(new Char() {","c}, StringSplitOptions.RemoveEmptyEntries) GetIDs = new List(Of Integer)(SplitIDs.Length) Dim CurID As Integer For Each id As String In SplitIDs If Integer.TryParse(id, CurID) Then GetIDs.Add(CurID) Next id End Function

Esperaba poder hacerlo en una o dos líneas de código en línea. Una línea para crear el conjunto de cadenas y, con suerte, encontrar algo en el marco que no sabía manejar para importarlo a una lista <int> que pudiera manejar el modelo inteligentemente. Pero si debo moverlo a un método, entonces lo haré. Y sí, estoy usando VB. Simplemente prefiero C # para hacer preguntas porque obtendrán una audiencia más amplia y estoy casi tan fluido.

Digamos que tengo una página web que actualmente acepta un único valor de ID a través de un parámetro url:
http://example.com/mypage.aspx?ID=1234

Quiero cambiarlo para aceptar una lista de identificadores, como esta:
http://example.com/mypage.aspx?IDs=1234,4321,6789

Por lo tanto, está disponible para mi código como una cadena a través de context.Request.QueryString ["IDs"]. ¿Cuál es la mejor manera de convertir ese valor de cadena en una lista <int>?

Editar: Sé cómo hacer .split () en una coma para obtener una lista de cadenas, pero lo pregunto porque no sé cómo convertir fácilmente esa lista de cadenas en una lista int. Esto todavía está en .Net 2.0, entonces no hay lambdas.


dividir es lo primero que viene a la mente, pero que devuelve una matriz, no una lista; podrías probar algo como:

List<int> intList = new List<int>; foreach (string tempString in ids.split('','') { intList.add (convert.int32(tempString)); }


Algo como esto podría funcionar:

public static IList<int> GetIdListFromString(string idList) { string[] values = idList.Split('',''); List<int> ids = new List<int>(values.Length); foreach (string s in values) { int i; if (int.TryParse(s, out i)) { ids.Add(i); } } return ids; }

Que luego sería utilizado:

string intString = "1234,4321,6789"; IList<int> list = GetIdListFromString(intString); foreach (int i in list) { Console.WriteLine(i); }


Creo que la forma más fácil es dividir como se muestra anteriormente, y luego recorrer los valores e intentar convertir a int.

class Program { static void Main(string[] args) { string queryString = "1234,4321,6789"; int[] ids = ConvertCommaSeparatedStringToIntArray(queryString); } private static int[] ConvertCommaSeparatedStringToIntArray(string csString) { //splitting string to substrings string[] idStrings = csString.Split('',''); //initializing int-array of same length int[] ids = new int[idStrings.Length]; //looping all substrings for (int i = 0; i < idStrings.Length; i++) { string idString = idStrings[i]; //trying to convert one substring to int int id; if (!int.TryParse(idString, out id)) throw new FormatException(String.Format("Query string contained malformed id ''{0}''", idString)); //writing value back to the int-array ids[i] = id; } return ids; } }


Para continuar con la respuesta anterior, simplemente iterando a través de la matriz devuelta por Split y convirtiendo a una nueva matriz de ints. Esta muestra a continuación en C #:

string[] splitIds = stringIds.Split('',''); int[] ids = new int[splitIds.Length]; for (int i = 0; i < ids.Length; i++) { ids[i] = Int32.Parse(splitIds[i]); }


Puede instanciar una Lista <T> de una matriz.

VB.NET:

Dim lstIDs as new List(of Integer)(ids.split('',''))

Sin embargo, esto es propenso a lanzar errores si la matriz contiene elementos no-int.


Puede usar string.Split () para dividir los valores una vez que los haya extraído de la URL.

string[] splitIds = ids.split('','');


Si te gusta el estilo funcional, puedes probar algo como

string ids = "1,2,3,4,5"; List<int> l = new List<int>(Array.ConvertAll( ids.Split('',''), new Converter<string, int>(int.Parse)));

No hay lambdas, pero tienes Convertidores y Predicados y otras cosas buenas que se pueden hacer con los métodos.


Sin ofender a quienes proporcionaron respuestas claras, pero muchas personas parecen estar respondiendo su pregunta en lugar de abordar su problema. Quieres múltiples identificaciones, entonces piensas que puedes hacer esto así:

http://example.com/mypage.aspx?IDs=1234,4321,6789

El problema es que esta es una solución no robusta. En el futuro, si quieres valores múltiples, ¿qué haces si tienen comas? Una mejor solución (y esto es perfectamente válido en una cadena de consulta), es usar múltiples parámetros con el mismo nombre:

http://example.com/mypage.aspx?ID=1234;ID=4321;ID=6789

Entonces, cualquiera que sea el analizador de cadenas de consulta que use debería poder devolver una lista de ID. Si no puede manejar esto (y también maneja punto y coma en lugar de ampersands), entonces está roto.


Tendrás que recurrir a ellos e int.TryParse cada uno de ellos. después de eso simplemente agregue a la lista.

No importa - @Splash me ganó


Todo lo que puedo pensar es recorrer la lista de cadenas (que tiene al realizar una división) y hacer algo como int.TryParse() en ellas una después de la otra y ponerlas en una nueva List<int> . Encapsularlo en un pequeño y agradable método de ayuda en alguna parte y no será demasiado horrible.


List<int> convertIDs = new List<int>; string[] splitIds = ids.split('',''); foreach(string s in splitIds) { convertIDs.Add(int.Parse(s)); }

Para completar, querrá poner try / catch alrededor del bucle for (o alrededor de la llamada int.Parse ()) y manejar el error según sus requisitos. También puedes hacer un tryparse () como ese:

List<int> convertIDs = new List<int>; string[] splitIds = ids.split('',''); foreach(string s in splitIds) { int i; int.TryParse(out i); if (i != 0) convertIDs.Add(i); }


Veo que mi respuesta llegó bastante tarde, es decir, varios otros habían escrito lo mismo. Por lo tanto, presento un método alternativo usando expresiones regulares para validar y dividir la cadena.

class Program { //Accepts one or more groups of one or more digits, separated by commas. private static readonly Regex CSStringPattern = new Regex(@"^(/d+,?)*/d+$"); //A single ID inside the string. Must only be used after validation private static readonly Regex SingleIdPattern = new Regex(@"/d+"); static void Main(string[] args) { string queryString = "1234,4321,6789"; int[] ids = ConvertCommaSeparatedStringToIntArray(queryString); } private static int[] ConvertCommaSeparatedStringToIntArray(string csString) { if (!CSStringPattern.IsMatch(csString)) throw new FormatException(string.Format("Invalid comma separated string ''{0}''", csString)); List<int> ids = new List<int>(); foreach (Match match in SingleIdPattern.Matches(csString)) { ids.Add(int.Parse(match.Value)); //No need to TryParse since string has been validated } return ids.ToArray(); } }