विधि तर्क के रूप में एक बूल फू (पैराम्स []) पास करें

ऐसे समय होते हैं जब तक कि इसे सत्यापित करने तक एक विधि को कई बार चलाने की आवश्यकता होती है। मेरे मामले में bar.Name.Equals ("जॉन डो") जैसे अभिव्यक्तियां हैं जिन्हें मैं चलाने और चलाने के लिए इस अभिव्यक्ति को मान्य करता हूं।

कुछ इस तरह:

bool succeeded = TryUntillOk(bar.Name.Equals("John Doe"), 15, 100);

जहां TryUntillOk एक विधि होगी जो प्रत्येक कॉल के बीच 100ms की नींद के साथ 15 बार इस अभिव्यक्ति को चलाती है।

मैंने इस उत्कृष्ट के उत्तरों की सूची पढ़ी इसी तरह के मुद्दे लेकिन मेरे मामले में कोई स्टैंडर प्रतिनिधि नहीं है कि यह TryUntillOk विधि स्वीकार करेगी।

प्रश्न का शीर्षक रचनात्मक नहीं है। इसे संपादित करने के लिए स्वतंत्र महसूस करें :)

0
जोड़ा संपादित
विचारों: 1
@ जॉर्ज डकेट यस। इसका जिक्र करने के लिए खेद है।
जोड़ा लेखक Odys, स्रोत
क्या यह एक अलग थ्रेड में चल रहा होगा? अन्यथा मूल्य बदलने के लिए कोई मौका नहीं होने वाला है।
जोड़ा लेखक George Duckett, स्रोत

3 उत्तर

आपको आमंत्रण को अनुकूलित करना होगा। @ जॉन के जवाब में लैम्ब्डा चालान है, यह संस्करण प्रतिनिधि से तुलना को अलग करता है

using System;
using System.Threading;

namespace test
{
    class something
    {
        public String Name;
    }

    class Program
    {
        private delegate bool TryableFunction(String s);

        private static bool TryUntillOk(TryableFunction f, String s, int howoften, int sleepms)
        {
            while (howoften-->0)
            {
                if (f(s)) return true;
                Thread.Sleep(sleepms);
            }
            return false;
        }

        static void Main(string[] args)
        {
            something bar=new something();

            bar.Name="Jane Doe";
            bool succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100);
            Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded);

            bar.Name="John Doe";
            succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100);
            Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded);
        }


    }
}
0
जोड़ा
वास्तव में यह मेरा पहला प्रयास था। बाद में मुझे एहसास हुआ कि कॉल करने के कई तरीके हो सकते हैं, जिसका अर्थ है कि मुझे ऐसे कई प्रतिनिधियों को घोषित करना होगा जो मैं बचाना चाहता हूं।
जोड़ा लेखक Odys, स्रोत
... जो वास्तव में लैम्ब्डा संस्करण हल करता है!
जोड़ा लेखक Eugen Rieck, स्रोत

आप शायद इस तरह कुछ ढूंढ रहे हैं:

bool TryRepeatedly(Func condition, int maxRepeats, TimeSpan repeatInterval)
{
    for (var i = 0; i < maxRepeats; ++i)
    {
        if (condition()) return true;
        Thread.Sleep(repeatInterval);//or your choice of waiting mechanism
    }
    return false;
}

निम्नानुसार कहा जाएगा:

bool succeeded = TryRepeatedly(() => bar.Name.Equals("John Doe"),
                               15,
                               TimeSpan.FromMilliseconds(100));

The only interesting part here is that you specify the condition as a Func, which is a delegate to a method that takes no parameters and returns a boolean. Lambda expression syntax allows you to trivially construct such a delegate at the call site.

0
जोड़ा
@GeorgeDuckett इस बात का जिक्र करने के लिए खेद है। यह सब कार्यकर्ता धागे में किया जाएगा
जोड़ा लेखक Odys, स्रोत
यह शायद ध्यान दिया जाना चाहिए कि यह कुछ बाहरी (अलग थ्रेड इत्यादि) पर निर्भर करता है जिससे स्थिति अंततः सही साबित हो जाती है।
जोड़ा लेखक George Duckett, स्रोत

तुम उसे देख सकते हो

delegate void d_name(string s);

d_name obj =new d_name(bar.Name.Equals);

bool succeeded = TryUntillOk(obj("John Doe"), 15, 100);

TryUntillOk(obj d,type parameter2,type parameter3 )
{
  //do your work
}  
0
जोड़ा