سؤال

أنا أحب قائمة comprehensions في بيثون ، لأنها بإيجاز تمثل التحول من قائمة.

ومع ذلك ، في لغات أخرى ، كثيرا ما أجد نفسي أكتب شيئا على غرار:

foreach (int x in intArray)
  if (x > 3) //generic condition on x
    x++ 
    //do other processing

هذا المثال هو في C#, حيث أنا تحت انطباع LINQ يمكن أن تساعد في هذا ، ولكن هناك بعض البرمجة المشتركة بناء والتي يمكن أن تحل محل هذا أقل قليلا من أنيقة الحل ؟ ربما بنية البيانات أنا لا يفكرون ؟

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

المحلول

الزيادة في النص الأصلي foreach حلقة لن يؤثر على محتويات المصفوفة ، فإن الطريقة الوحيدة للقيام بذلك يبقى for حلقة:

for(int i = 0; i < intArray.Length; ++i)
{
    if(intArray[i] > 3) ++intArray[i];
}

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

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

باستخدام where (أو ما يعادلها) ، كما هو مبين في بعض إجابات أخرى, سوف تستبعد أي قيم أقل من أو يساوي 3 من الناتج تسلسل.

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

هناك ForEach طريقة المصفوفات التي سوف تسمح لك باستخدام وظيفة لامدا بدلا من foreach كتلة ، على الرغم من أي شيء أكثر من استدعاء الأسلوب سوف العصا مع foreach.

intArray.ForEach(i => DoSomething(i));

نصائح أخرى

في C# يمكنك تطبيق انتقائية على أي شيء أن يعيش داخل IEnumerable مثل هذا:

intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));

الخ..

في بيثون ، لديك مرشح خريطة, التي يمكن حتى ما تريد:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))

هناك أيضا قائمة comprehensions الذي يمكن القيام به على حد سواء في البيان:

[f(x + 1) for x in intArray if x > 3]

في روبي:

intArray.select { |x| x > 3 }.each do |x|
  # do other processing
end

أو إذا كان "معالجة أخرى" هي قصيرة بطانة واحدة:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x }

وأخيرا, إذا كنت ترغب في العودة مجموعة جديدة تحتوي على نتائج معالجة تلك العناصر أكبر من 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))

يعتمد على اللغة و ما تحتاج إلى القيام به ، "الخريطة" كما يطلق عليه في العديد من اللغات يمكن أن يكون ما تبحث عنه.أنا لا أعرف C#, ولكن وفقا هذا الصفحة .NET 2.0 المكالمات خريطة "ConvertAll".

معنى "خريطة" هو بسيط جدا - خذ قائمة ، وتطبيق وظيفة كل عنصر منه ، والعودة قائمة جديدة.يمكنك أيضا أن تبحث عن "تصفية" ، التي من شأنها أن تعطي لك قائمة من البنود التي تلبي المسند في آخر القائمة.

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