استبدال إن مجموعة التكرار
سؤال
أنا أحب قائمة 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".
معنى "خريطة" هو بسيط جدا - خذ قائمة ، وتطبيق وظيفة كل عنصر منه ، والعودة قائمة جديدة.يمكنك أيضا أن تبحث عن "تصفية" ، التي من شأنها أن تعطي لك قائمة من البنود التي تلبي المسند في آخر القائمة.