ما هو قرار التصميم لوظائف المتغيرات التي تحتاج إلى صفيف؟

StackOverflow https://stackoverflow.com/questions/1126740

سؤال

أنا فضولي ونأمل أن يستطيع شخص ما إلقاء بصمه بصمه على هذا - ولكن لماذا يجب أن تكون المهام C # التي تتخذ "Params" صفيفا؟

أحصل على أن الكائنات الموجودة في قائمة المعلمات يتم إدخالها في صفيف ولكن ما إذا كان شخص ما يريد إنشاء وظيفة المتغيرات التي تأخذ في عدد غير محدد من كائنات الصفيف؟

خذ هذه الوظيفة على سبيل المثال ...

private Int32 Sum(params Int32[] numbers)
{
    return numbers.Sum(); // Using LINQ here to sum
}

إلى الأمام بشكل مستقيم، يمكن أن يستغرق في كمية مختلفة من الأرقام - على سبيل المثال ...

Int32 x = Sum(1);
Int32 y = Sum(1, 2);
Int32 z = Sum(1, 2, 3);

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

private Int32 SumArrays(params Object[] numbers)
{
    Int32 total = 0;
    foreach (Object o in numbers)
    {
        Int32[] array = (Int32[])o;

        total += array.Sum();
    }
    return total;
}

التي يمكن بعد ذلك استخدامها مثل ...

Int32[] arr1 = new Int32[] { 1, 2, 3 };
Int32[] arr2 = new Int32[] { 1, 2, 3, 4 };
Int32[] arr3 = new Int32[] { 1, 2, 3, 4, 5 };

Int32 x = SumArrays((Object)arr1, (Object)arr2);
Int32 y = SumArrays((Object)arr1, (Object)arr2, (Object)arr3);

ماذا كان المنطق وراء هذا؟ لماذا لم ينفذ هذا من أي وقت مضى بمتغير واحد غير صفيف؟ مثل params Int32?

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

المحلول

الوظيفة موجودة بالفعل، لا حاجة إلى اللجوء إلى الملاكمة:

private int SumAll(params int[][] args)
{
    int result = 0;
    for (int x = 0; x < args.Length; x++)
    {
        for (int y = 0; y < args[x].Length; y++)
        {
            result += args[x][y];
        }
    }
    return result;
}

تحتاج فقط إلى إضافتها مجموعة من الصفائف.

نصائح أخرى

يتم تواليت المعارف إلى كائن واحد، والأكائن الأقل مستوى يمكن أن تحمل مجموعة هي صفيف. إذا كنت تريد وظيفة تأخذ عدد متغير من صفيفات Ints، فيجب الإعلان عنها كأخذ مجموعة من صفائف Int.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top