Domanda

Diciamo che ho una pagina web che accetta un singolo valore di ID tramite un parametro url:
http://example.com/mypage.aspx?ID=1234

Io la voglio cambiare per accettare un elenco di id, come questo:
http://example.com/mypage.aspx?IDs=1234,4321,6789

Quindi è a disposizione il mio codice è una stringa via contesto.Richiesta.QueryString["Id"]. Qual è il modo migliore per girare quel valore stringa in una Lista<int>?

Edit: Io so come fare .spalato (split) su una virgola per ottenere un elenco di stringhe, ma mi chiedo perché non so come convertire facilmente che la stringa elenco int lista.Questo è ancora in .Net 2.0, quindi non lambda.

È stato utile?

Soluzione

Senza offesa per coloro che hanno fornito risposte chiare, ma molte persone sembrano rispondere alla tua domanda invece di affrontare il problema.Volete di più Id, in modo che si pensi di questo:

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

Il problema è che questa è una non-soluzione robusta.In futuro, se si desidera che i valori di più, cosa si può fare se si hanno le virgole?Una soluzione migliore (e questo è perfettamente valido in una stringa di query), è quello di utilizzare più parametri con lo stesso nome:

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

Quindi, qualunque sia la stringa di query parser si utilizza dovrebbe essere in grado di restituire un elenco di Id.Se non è possibile gestire questo (e anche di gestire il punto e virgola invece di e commerciali), poi si è rotto.

Altri suggerimenti

Qualcosa di simile potrebbe funzionare:

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

Che sarebbe poi essere utilizzato:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

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

È possibile creare un'istanza di un Elenco<T> da un array.

VB.NET:

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

Questo è incline a errori di inserimento, anche se l'array contiene non int elementi

Tutto quello che posso pensare è quello di loop sopra l'elenco di stringhe (che avete ottenuto da eseguire uno split) e fare qualcosa di simile int.TryParse() uno dopo l'altro e metterli in un nuovo List<int>.Incapsulare in un bel po ' di metodo helper da qualche parte e non essere troppo orribile.

Se ti piace lo stile funzionale, si può provare qualcosa di simile

    string ids = "1,2,3,4,5";

    List<int> l = new List<int>(Array.ConvertAll(
        ids.Split(','), new Converter<string, int>(int.Parse)));

Non lambda, ma si dispone di Convertitori e Predicati e altre belle cose che possono essere fatte dai metodi.

Vedo la mia risposta arrivò piuttosto tardi, cioèmolti altri avevano scritto le stesse.Quindi vi propongo un metodo alternativo utilizzando le espressioni regolari per convalidare e dividere la stringa.

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

Finale frammento di codice che prende quello che spero è il migliore da tutti i suggerimenti:

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

Speravo di essere in grado di farlo in una o due righe di codice inline.Una linea per creare la matrice di stringhe e la speranza di trovare qualcosa nel quadro già non sanno gestire l'importazione di un Elenco<int> in grado di gestire il cast in modo intelligente.Ma se devo spostare un metodo, poi mi.E sì, sto usando VB.Io preferisco C# per fare domande, perché si otterrà un pubblico più vasto, e sono quanto di più fluente.

spalato è la prima cosa che viene in mente, ma che restituisce un array, non una Lista;si può provare qualcosa di simile:


List<int> intList = new List<int>;

foreach (string tempString in ids.split(',')
{
    intList.add (convert.int32(tempString));
}

È possibile utilizzare una stringa.Split() per dividere i valori di una volta estratta da loro l'URL.

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

Basta foreach attraverso di loro e int.TryParse ogni uno di loro.dopo di che basta aggiungere all'elenco.

Nevermind - @Splash battere me

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

Per completezza si vuole mettere provate/le catture di tutto il ciclo for (o intorno int.Parse() chiamata) e gestire l'errore in base alle vostre esigenze.Si può anche fare un tryparse() in questo modo:

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

Per continuare nella precedente risposta, molto semplicemente scorrere l'array restituito da Spalato e la conversione a un nuovo array di interi.Questo esempio riportato di seguito in 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]);
        }

Penso che il modo più semplice è quello di dividere, come mostrato prima, e poi un ciclo attraverso i valori e cercare di convertire 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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top