Vra

Kom ons sê ek het 'n webblad wat tans 'n enkele ID waarde via 'n url parameter aanvaar:
     http://example.com/mypage.aspx?ID=1234

Ek wil om dit te verander na 'n lys van ids aanvaar, soos volg:
     http://example.com/mypage.aspx?IDs=1234,4321, 6789

Dit is dus beskikbaar om my kode as 'n string via context.Request.QueryString [ "ID's"]. Wat is die beste manier om dit te string waarde te omskep in 'n Lys ?

Edit: Ek weet hoe om .split () doen op 'n komma na 'n lys van stringe kry, maar ek vra, want ek weet nie hoe om dit string lys maklik om te skakel na 'n int lys. Dit is nog steeds in NET 2.0, sodat daar geen lambdas.

Was dit nuttig?

Oplossing

Geen misdryf om diegene wat verskaf duidelike antwoorde nie, maar baie mense blyk te wees beantwoord jou vraag in plaas van die aanspreek van jou probleem. Jy wil verskeie ID's, so jy dink jy kan hierdie hierdie:

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

Die probleem is dat dit 'n nie-robuuste oplossing. In die toekoms, as jy wil veelvuldige waardes, wat doen jy as hulle kommas? 'N beter oplossing (en dit is volkome geldig in 'n soektog string), is om verskeie parameters te gebruik met dieselfde naam:

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

Toe, wat ook al navraag string parser wat jy gebruik moet in staat wees om 'n lys van ID's terug te keer. As dit dit nie kan hanteer nie (en hanteer ook semi-dubbele punte in plaas van amper sands), dan is dit gebreek.

Ander wenke

Iets soos hierdie kan werk:

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

Wat sou dan gebruik word:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

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

Jy kan 'n lys instansieer van 'n skikking.

VB.NET:

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

Dit is geneig om beslissende foute al as die skikking bevat nie-int elemente

Al wat ek kan dink is om lus oor die lys van stringe (wat jy het gekry van die uitvoering van 'n split) en iets soos int.TryParse() doen op hulle een na die ander en sit hulle in 'n nuwe List<int>. Omsluit dit in 'n mooi klein helper metode iewers en dit sal nie te aaklige wees.

As jy graag die funksionele styl, kan jy iets soos

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

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

Geen lambdas, maar jy het wel Converters en gezegdes en ander lekker dinge wat gemaak kan word uit metodes.

Ek sien my antwoord eerder laat kom, dit wil sê 'n paar ander het geskryf dieselfde. Daarom bied ek 'n alternatiewe metode met behulp van gereelde uitdrukkings te bekragtig en te verdeel die string.

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

Final kode uit dat neem wat ek hoop is die beste van al die voorstelle:

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

Ek het gehoop om in staat wees om dit te doen in een of twee reëls van die kode inline. Een lyn na die string array skep en hopelik vind iets in die raamwerk Ek het nie reeds weet om te hanteer invoer dit om 'n lys dat die cast intelligent kan hanteer. Maar as ek moet dit skuif na 'n metode dan sal ek. En ja, ek gebruik VB. Ek verkies net C # vir vrae te vra omdat hulle 'n groter gehoor kry en ek is net omtrent so vlot.

split is die eerste ding wat opkom, maar dat 'n skikking, nie 'n Lys terugkeer; jy kan iets soos probeer:


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

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

Jy kan string.Split () gebruik om die waardes verdeel sodra jy hulle uit die URL het onttrek.

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

Jy sal net moet foreach deur hulle en int.TryParse elkeen van hulle. daarna net toe te voeg tot die lys.

Nevermind - @Splash my klop om dit

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

Vir volledigheid jy sal wil hê om te sit probeer / vang rondom die for-lus (of rondom die int.Parse () oproep) en hanteer die fout wat gebaseer is op jou behoeftes. Jy kan ook 'n tryparse () soos so:

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

Om voort te gaan op vorige antwoord eenvoudig iterating deur die skikking teruggekeer deur Split en die omskakeling na 'n nuwe reeks van SY. Hierdie hieronder monster 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]);
        }

Ek dink die maklikste manier is om te verdeel as voorheen gewys, en dan lus deur die waardes en probeer om te skakel na 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;
    }
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top