الطريقة الأكثر إيجازًا لتحديد ما إذا كان المتغير يساوي قيمة من "قائمة" القيم

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

  •  09-06-2019
  •  | 
  •  

سؤال

إذا كان لدي متغير في C# يحتاج إلى التحقق لتحديد ما إذا كان يساوي أحد مجموعة المتغيرات، ما هي أفضل طريقة للقيام بذلك؟

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

أعلم أنه يمكنني فعل شيء مثل هذا:

int baseCase = 5;
bool testResult = baseCase == 3 || baseCase == 7 || baseCase == 12 || baseCase == 5;

أشعر بالفضول لمعرفة ما إذا كان بإمكاني القيام بشيء أكثر مثل هذا:

int baseCase = 5;
bool testResult = baseCase == (3 | 7 | 12 | 5);

من الواضح أن ما سبق لن ينجح، ولكنني مهتم بمعرفة ما إذا كان هناك شيء أكثر إيجازًا من المثال الأول، والذي يجب أن يكرر نفس المتغير مرارًا وتكرارًا لكل قيمة اختبار.

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

لسوء الحظ، حيث أعمل، يستخدم نظامنا إطار عمل .NET 2.0 وليس هناك فرصة للترقية في أي وقت قريب.هل هناك أي حلول أخرى لا تعتمد على إطار عمل .NET 3.5، إلى جانب الحل الأكثر وضوحًا الذي يمكنني التفكير فيه:

new List<int>(new int[] { 3, 6, 7, 1 }).Contains(5);
هل كانت مفيدة؟

المحلول

        bool b = new int[] { 3,7,12,5 }.Contains(5);

نصائح أخرى

يمكنك القيام بشيء مماثل مع .NET 2.0، من خلال الاستفادة من حقيقة أن مصفوفة T تنفذ IList<T>، وأن IList<T> لديها أسلوب يحتوي على.لذلك فإن ما يلي يعادل حل Corey .NET 3.5، على الرغم من أنه أقل وضوحًا:

bool b = ((IList<int>)new int[] { 3, 7, 12, 5 }).Contains(5); 

غالبًا ما أستخدم IList<T> لإعلانات المصفوفة، أو على الأقل لتمرير وسيطات المصفوفة أحادية البعد.هذا يعني أنه يمكنك استخدام خصائص IList مثل Count، والتحويل من مصفوفة إلى قائمة بسهولة.على سبيل المثال

private readonly IList<int> someIntegers = new int[] { 1,2,3,4,5 };

أنا عادة استخدام كوري نحل لحالات بسيطة من هذا القبيل.أي شيء أكثر تعقيدًا، استخدم استعلام LINQ.

نظرًا لأنك لم تحدد نوع البيانات التي لديك كمدخلات، فسأفترض أنه يمكنك تقسيم مدخلاتك إلى قوى 2 -> 2,4,8,16...سيسمح لك هذا باستخدام البتات لتحديد ما إذا كانت قيمة الاختبار الخاصة بك هي إحدى البتات الموجودة في الإدخال.

4 => 0000100
16 => 0010000
64 => 1000000

باستخدام بعض الرياضيات الثنائية ...

قائمة الاختبار = 4 + 16 + 64 => 1010100
قيمة الاختبار = 16
testResult = testList & testValue

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