سؤال

لنفترض أن لدي صفحة ويب تقبل حاليًا قيمة معرف واحدة عبر معلمة url:
http://example.com/mypage.aspx?ID=1234

أريد تغييره لقبول أ قائمة من معرفات، مثل هذا:
http://example.com/mypage.aspx?IDs=1234,4321,6789

لذلك فهو متاح للكود الخاص بي كسلسلة عبر context.Request.QueryString["المعرفات"]. ما هي أفضل طريقة لتحويل قيمة السلسلة إلى قائمة<int>؟

يحرر: أعرف كيفية عمل .split() على فاصلة للحصول على قائمة من السلاسل، لكنني أسأل لأنني لا أعرف كيفية تحويل قائمة السلاسل هذه بسهولة إلى قائمة int.لا يزال هذا في .Net 2.0، لذا لا توجد لامدا.

هل كانت مفيدة؟

المحلول

لا إهانة لأولئك الذين قدموا إجابات واضحة، ولكن يبدو أن العديد من الأشخاص يجيبون على سؤالك بدلاً من معالجة مشكلتك.تريد معرفات متعددة، لذلك تعتقد أنه يمكنك القيام بذلك:

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

المشكلة هي أن هذا الحل غير قوي.في المستقبل، إذا كنت تريد قيمًا متعددة، فماذا تفعل إذا كانت بها فواصل؟الحل الأفضل (وهذا صحيح تمامًا في سلسلة استعلام)، هو استخدام معلمات متعددة بنفس الاسم:

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

ومن ثم، أيًا كان محلل سلسلة الاستعلام الذي تستخدمه، فيجب أن يكون قادرًا على إرجاع قائمة المعرفات.إذا لم يتمكن من التعامل مع هذا (وأيضًا التعامل مع الفواصل المنقوطة بدلاً من علامات العطف)، فهو معطل.

نصائح أخرى

قد يعمل شيء مثل هذا:

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

والتي سيتم استخدامها بعد ذلك:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

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

يمكنك إنشاء قائمة <T> من صفيف.

فب.نت:

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

هذا عرضة لأخطاء الإرسال على الرغم من أن المصفوفة تحتوي على عناصر غير صحيحة

كل ما يمكنني التفكير فيه هو تكرار قائمة السلاسل (التي حصلت عليها من إجراء التقسيم) والقيام بشيء مثل int.TryParse() عليهم واحدا تلو الآخر ووضعهم في الجديد List<int>.قم بتغليفها بطريقة مساعدة صغيرة لطيفة في مكان ما ولن تكون فظيعة للغاية.

إذا كنت تحب النمط الوظيفي، يمكنك تجربة شيء من هذا القبيل

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

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

لا توجد لامدا، ولكن لديك محولات ومسندات وأشياء لطيفة أخرى يمكن إجراؤها من الطرق.

أرى إجابتي جاء متأخرا نوعا ما، أي.وقد كتب العديد من الآخرين نفس الشيء.لذلك أقدم طريقة بديلة باستخدام التعبيرات العادية للتحقق من صحة السلسلة وتقسيمها.

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

مقتطف الكود النهائي الذي يأخذ ما آمل أن يكون الأفضل من جميع الاقتراحات:

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

كنت أتمنى أن أتمكن من القيام بذلك في سطر أو سطرين من التعليمات البرمجية المضمنة.سطر واحد لإنشاء مصفوفة السلسلة ونأمل العثور على شيء ما في إطار العمل الذي لم أكن أعرفه بالفعل للتعامل مع استيراده إلى قائمة<int> يمكنها التعامل مع طاقم الممثلين بذكاء.ولكن إذا كان لا بد لي من نقله إلى طريقة فسوف أفعل ذلك.ونعم، أنا أستخدم VB.أنا أفضّل استخدام لغة C# لطرح الأسئلة لأنها ستجذب جمهورًا أكبر وأنا أتقنها تمامًا.

الانقسام هو أول ما يتبادر إلى الذهن، ولكنه يُرجع مصفوفة، وليس قائمة؛يمكنك تجربة شيء مثل:


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

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

يمكنك استخدام string.Split() لتقسيم القيم بمجرد استخراجها من عنوان URL.

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

سيكون عليك فقط البحث من خلالها والتحليل. حاول تحليل كل واحدة منها.بعد ذلك فقط أضف إلى القائمة.

لا يهم - سبقتني @Splash

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

للاكتمال، ستحتاج إلى إجراء محاولة/التقاط حول حلقة for (أو حول استدعاء int.Parse()) ومعالجة الخطأ بناءً على متطلباتك.يمكنك أيضًا إجراء محاولة المحاولة () كما يلي:

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

للاستمرار في الإجابة السابقة، ما عليك سوى تكرار المصفوفة التي تم إرجاعها بواسطة Split والتحويل إلى مصفوفة جديدة من ints.هذه العينة أدناه في 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]);
        }

أعتقد أن أسهل طريقة هي التقسيم كما هو موضح من قبل، ثم تكرار القيم ومحاولة التحويل إلى 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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top