Pregunta

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

Quiero cambiarlo para aceptar un lista de identificadores, así:
http://ejemplo.com/mipágina.aspx?IDs=1234,4321,6789

Entonces está disponible para mi código como una cadena a través de context.Request.QueryString["ID"]. ¿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, por lo que no hay lambdas.

¿Fue útil?

Solución

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

http://ejemplo.com/mipágina.aspx?IDs=1234,4321,6789

El problema es que se trata de una solución no sólida.En el futuro, si desea varios valores, ¿qué hará si tienen comas?Una mejor solución (y esto es perfectamente válido en una cadena de consulta) es utilizar múltiples parámetros con el mismo nombre:

http://ejemplo.com/mipágina.aspx?ID=1234;ID=4321;ID=6789

Luego, cualquier analizador de cadenas de consulta que utilice debería poder devolver una lista de ID.Si no puede manejar esto (y también manejar punto y coma en lugar de símbolos), entonces está roto.

Otros consejos

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 se usaría:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

foreach (int i in list)
{
    Console.WriteLine(i);
}

Puede crear una instancia de List<T> a partir de una matriz.

VB.NET:

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

Sin embargo, esto es propenso a errores de conversión si la matriz contiene elementos que no son int

Lo único que se me ocurre es recorrer la lista de cadenas (que se obtienen al realizar una división) y hacer algo como int.TryParse() sobre ellos uno tras otro y colocándolos en un nuevo List<int>.Encapsúlelo en algún pequeño método de ayuda y no será demasiado horrible.

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 interesantes que se pueden crear a partir de métodos.

Veo mi respuesta llegó bastante tarde, es decirvarios otros habían escrito lo mismo.Por ello presento un método alternativo utilizando 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();
    }
}

Fragmento de código final que toma lo que espero sea lo 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 la matriz de cadenas y, con suerte, encontrar algo en el marco que aún no sabía para importarlo a un List<int> que pudiera manejar la conversión de manera inteligente.Pero si debo pasarlo a un método, lo haré.Y sí, estoy usando VB.Simplemente prefiero C# para hacer preguntas porque atraerán a una audiencia más amplia y hablo con la misma fluidez.

dividir es lo primero que me viene a la mente, pero 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));
}

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

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

Solo tendrás que buscarlos e int.TryParse cada uno de ellos.después de eso simplemente agréguelo a la lista.

No importa - @Splash se me adelantó

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

Para completar, querrá colocar 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() así:

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);
}

Para continuar con la respuesta anterior, simplemente itere a través de la matriz devuelta por Split y conviértala a una nueva matriz de enteros.Este ejemplo 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]);
        }

Creo que la forma más sencilla es dividir como se muestra antes y luego recorrer los valores e intentar convertirlos 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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top