Question

Supposons que ma page Web accepte actuellement une valeur d'identifiant unique via un paramètre d'URL:
     http://example.com/mypage.aspx?ID=1234

Je souhaite le modifier pour accepter une liste d'identifiants, comme ceci:
     http://example.com/mypage.aspx?IDs=1234,4321, 6789

Donc, mon code est disponible sous forme de chaîne via context.Request.QueryString [" ID "]]. Quel est le meilleur moyen de transformer cette valeur de chaîne en un Liste & Lt; int & Gt;?

Modifier: Je sais comment faire .split () sur une virgule pour obtenir une liste de chaînes, mais je demande, car je ne sais pas comment convertir facilement cette liste de chaînes en un entier. liste. Ceci est toujours en .Net 2.0, donc pas de lambdas.

Était-ce utile?

La solution

N'offensez pas ceux qui ont fourni des réponses claires, mais de nombreuses personnes semblent répondre à votre question au lieu de résoudre votre problème. Vous voulez plusieurs identifiants, alors vous pensez pouvoir le faire:

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

Le problème est qu’il s’agit d’une solution peu robuste. Dans le futur, si vous voulez plusieurs valeurs, que faites-vous si elles ont des virgules? Une meilleure solution (parfaitement valable dans une chaîne de requête) consiste à utiliser plusieurs paramètres portant le même nom:

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

Ensuite, quel que soit l'analyseur de chaîne de requête utilisé, vous devriez pouvoir renvoyer une liste d'identifiants. S'il ne peut pas gérer cela (et gère également les points-virgules au lieu d'esperluètes), alors il est cassé.

Autres conseils

Quelque chose comme ça pourrait marcher:

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

Ce qui serait alors utilisé:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

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

Vous pouvez instancier une liste < T > à partir d'un tableau.

VB.NET:

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

Ceci est sujet aux erreurs de conversion si le tableau contient des éléments non-int

Tout ce à quoi je peux penser est de faire une boucle sur la liste des chaînes (que vous avez obtenues en effectuant une scission) et de faire quelque chose comme int.TryParse() sur elles les unes après les autres et de les placer dans un nouveau List<int>. Encapsulez-le dans une belle méthode d'assistance quelque part et ce ne sera pas trop horrible.

Si vous aimez le style fonctionnel, vous pouvez essayer quelque chose comme

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

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

Pas de lambda, mais vous avez des convertisseurs et des prédicats et d’autres choses intéressantes qui peuvent être créées à partir de méthodes.

Je vois que ma réponse est venue assez tard, c’est-à-dire que plusieurs autres avaient écrit le même. Par conséquent, je présente une méthode alternative utilisant des expressions régulières pour valider et diviser la chaîne.

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

Extrait de code final qui reprend ce que j'espère est le meilleur parmi toutes les suggestions:

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

J'espérais pouvoir le faire en une ou deux lignes de code en ligne. Une ligne pour créer le tableau de chaînes et espérer trouver quelque chose dans le framework que je ne savais pas déjà gérer l’importation dans une liste & Lt; int & Gt; cela pourrait gérer le casting intelligemment. Mais si je dois le déplacer vers une méthode, alors je le ferai. Et oui, j'utilise VB. Je préfère simplement C # pour poser des questions, car ils auront un public plus large et je suis presque aussi à l'aise.

split est la première chose qui me vient à l’esprit, mais qui retourne un tableau, pas une liste; vous pouvez essayer quelque chose comme:


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

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

Vous pouvez utiliser string.Split () pour fractionner les valeurs une fois extraites de l'URL.

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

Il vous suffira de traverser chacun d'eux et de les essayer. après cela, il suffit d'ajouter à la liste.

Nevermind - @Splash m'a battu

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

Pour être complet, vous voudrez mettre try / catch autour de la boucle for (ou autour de l'appel int.Parse ()) et gérer l'erreur en fonction de vos besoins. Vous pouvez aussi faire un tryparse () comme ceci:

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

Pour continuer avec la réponse précédente, parcourez simplement le tableau renvoyé par Split et convertissez-le en un nouveau tableau d'ints. Cet exemple ci-dessous 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]);
        }

Je pense que le moyen le plus simple est de scinder comme indiqué précédemment, puis de parcourir les valeurs et d'essayer de convertir en 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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top