التعامل مع القيم المفردة والمتعددة بطرق C# بشكل فعال

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

  •  03-07-2019
  •  | 
  •  

سؤال

لدي طريقة مثل:

AverageAndDoSomeMath (Point2)

وأتساءل كيف أتعامل مع:

AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple

باستخدام تنفيذ واحد ويفضل.

بالنسبة للتجميع، أخطط لاستخدام النوع IEnumerable حتى أتمكن من تمرير أي نوع من المجموعات، ولكن بالنسبة لقيمة واحدة، لا أريد تغليفها وتمريرها كمجموعة، لأن المجموعة نفسها لا تخدم أي غرض سوى تلبية النوع.

كيف يمكن التعامل معها بأفضل طريقة وأوضح وأسرع وأكثر كفاءة؟

يحرر:ربما كان ينبغي عليّ اختيار اسم طريقة أفضل، لكن الطريقة تحسب متوسط ​​جميع النقاط، بالنسبة لقيمة واحدة، لا يكون الأمر منطقيًا، ولكن فكر في الأمر على أنه سيتم استخدام القيمة لقول حساب قيمة أخرى، ولكن ما هو الأمر المهم هو العثور على المتوسط، لذا لا يمكنني استدعاء الطريقة الأولى.

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

المحلول

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

يمكنك استخدام المعلمات في طريقتك:

public void Average(params Point2[] points)

وبعد ذلك يمكنك استدعاؤه بأي عدد من الوسائط، أو باستخدام مصفوفة:

Average(P1);
Average(P2, P3, P4);
Average(); // this one becomes an empty array in the method

Point[] array = new Point[] { P1, P2, P3, P4 };
Average(array);

أو بدلاً من ذلك، يمكنك استخدام صيغة المصفوفة القصيرة لاختتام الكائن الخاص بك:

Average({ P1 }); // this is legal C# for making an array with 1 element

يحرر: بعد قراءة ملاحظتك، أود أن أقترح أن مصفوفة المعلمات هي أوضح طريقة للقيام بما تريد.الجانب السلبي الوحيد لذلك هو أنه لا يمكنك المرور IEnumerable<Point2> (أو مجموعات أخرى مثل أ List<Point2>) دون الاتصال الأول ToArray(), ، لأنه لا يتطلب سوى المصفوفات الفعلية.

نصائح أخرى

اكتب طريقتين

  • AverageAndDoSomeMath (نقطة Point2)
  • AverageAndDoSomeMath (نقاط IEnumerable<Point2>)

واجعل الأول يستدعي الثاني عن طريق لفه في مجموعة.

public decimal AverageAndDoSomeMath (Point2 point)
{
    return AverageAndSomeMath(new []{point});
}

أعتقد أن هذا ما كان يدور في ذهنك بالفعل ولكنك اعتقدت أنه لم يكن الحل الصحيح، أليس كذلك؟

يحرر: تبسيط الطريقة (بفضل فريدي ريوس)

قد تقول مسؤولية واحدة لكل طريقة أن طريقتك يجب أن تفعل شيئًا واحدًا فقط - حساب المتوسط ​​الحسابي - وهذا كل شيء.لا يوجد "AndDoSomeOtherMath".

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top