التحقق من شرط على عنصر في القائمة دون foreach


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

ج#
foreach(string[] item in mylist)
{
  if(Convert.ToBoolean(item[0]){}
}

يمكنني فقط الوصول إلى عنصر قائمتي مباشرة. كيف يمكنني تحقيق ذلك؟

شكرًا!

الحل 4

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

السؤال الذي عليك توضيحه هنا هو ما هو بالضبط انت تريد تم إرجاعه من التكرار الخاص بك لقائمة السلاسل:

1. قائمة الفهارس في القائمة حيث توجد سلاسل قابلة للتحويل إلى قيم منطقية؟

2. أو مجرد مجموعة من القيم المنطقية في القائمة: بدون الفهارس، من الصعب تخيل استخدام لذلك.

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

4. راجع تعليقي على مشاركتك أعلاه لمعرفة ما تحتاج إلى توضيحه أيضًا

سأعرض لك مثالاً هنا لإرجاع قائمة السلاسل كقاموس … حيث “المفتاح” هو فهرس القيمة المنطقية في القائمة، والقيمة هي القيمة المنطقية المحولة.

ج#
// required
using System.Linq

// assume the data source here is a simple List<string>
List<string> strList = new List<string>
{
    "True", "what", "False", "True", "ozone", "False"
};

// this variable must be initialized to be used in the Linq shown here
bool booltest = false;

Dictionary<int,bool> dctIntBool = strList
.Select((str, index) => new {index, str})
.Where(pair => Boolean.TryParse(pair.str, out booltest))
.ToDictionary(pair => pair.index, pair => booltest);

لاحظ الاختلاف في Linq ‘Select الذي ينشئ/يحافظ على فهرس المجموعة التي يكررها ويستخدم هنا: يتم عرض كل زوج من الفهرس/القيمة في بنية مجهولة جديدة؛ بعد ذلك، تقوم عبارة Where Linq بتصفية تلك “الأزواج” بحيث يتم تجاهل أي زوج لا تكون السلسلة فيه قابلة للتحويل إلى “bool”؛ أخيرًا، يتم استخدام Linq ToDictionary لإنشاء بنية القاموس، باستخدام القيمة المنطقية المخصصة لقيمة كل KeyValuePair لـ “booltest” بواسطة عبارة “TryParse” في جملة Where.

الحل 2

إذا كنت تريد التكرار على مجموعة، ولا ترغب في استخدام foreach Loop، ليس لديك خيارات أكثر بكثير من a for حلقة. بهذه الطريقة (أفترض mylist هو IList):

ج#
int count = mylist.Count;
string[] result; // This assumes you have an IList<string[]>
for (int i = 0; i < count; i++)
{
   result = mylist[i];
   bool value = Convert.ToBoolean(result[0]);
}

لا أستطيع أن أرى سبب عملك مع قائمة صفائف السلاسل للحصول على قيمة منطقية. من الواضح أنه يجب أن يكون هناك تطبيق أفضل/أنظف.

أتمنى أن يساعدك هذا. حظ سعيد.

الحل 3

اذا كنت تقصد List<T>، يمكنك استخدام القائمة. تحتوي على الطريقة[^].

ج#
List<string> mylist = new List<string>(){"cat","dog","bird"};

var result = mylist.Contains("bird");
Console.WriteLine("A list {0} 'bird' word", result==true ? "contains" : "does not contain");

الحل 5

لا يوجد شيء اسمه معجزة. إذا كنت تستخدم طريقة ما بدون حلقة، فهذا يعني أنه يتم استخدام بعض الحلقات خلف الغطاء. ولكن غالبًا ما يكون استخدام مثل هذه الأساليب منطقيًا تمامًا. انظر، على وجه الخصوص، الطريقة العامة System.Array.ForEach<>:

[^].

-سا

الحل 6

يمكنك استخدام دالة lambda، التي تشبه تحسين الأساليب المجهولة، والتي تجعل قراءة الشرط أسهل:

bool exists = myList.Any(x => Convert.ToBoolean(x) == true);
if (exists) {
    // Do something
}

コメント

タイトルとURLをコピーしました