делегаты в C # - PullRequest
       22

делегаты в C #

0 голосов
/ 18 января 2010

У меня есть 3 файла, которые мне нужно сравнить с 100 другими файлами (используя некоторые функции, которые я написал). Я беру каждый файл из трех и в цикле сравниваю их с каждым из 100 файлов. я хочу использовать функции последовательно, после того как я закончу сравнивать 3 файла со 100 файлами, я хочу активировать следующую функцию, как я могу это сделать (подпись функций одинакова, поэтому я могу использовать делегат, но я не знаю как) Вот псевдокод для сравнения:

for(i=0;i<3;i++)
{
 for(j=0;j<100;j++)
   compare(filesArr1[i],filesArr2[j]);
}

После окончания двух циклов я хочу активировать следующую функцию сравнения ...

Ответы [ 4 ]

3 голосов
/ 18 января 2010

Хорошо, так что в основном вы пытаетесь параметризовать общий метод путем сравнения.Нечто подобное должно работать для вас:

public void CompareFiles(IEnumerable<string> firstFiles,
                         IEnumerable<string> secondFiles,
                         Action<string, string> comparison)
{
    foreach (string file1 in firstFiles)
    {
        foreach (string file2 in secondFiles)
        {
            comparison(file1, file2);
        }
    }
}

Затем вызовите его с помощью:

CompareFiles(arrFiles1, arrFiles2, FirstComparison);
CompareFiles(arrFiles1, arrFiles2, SecondComparison);

Это предполагает, что метод сравнения уже предпринимает какие-либо соответствующие действия.Если нужно что-то вернуть, вы, вероятно, захотите использовать Func некоторого описания - более подробные данные будут полезны.

2 голосов
/ 18 января 2010

Следующий код запустит предоставленный вами цикл дважды; первый раз вызов comp1, а второй вызов comp2. Вы можете увеличить количество функций сравнения: а) писать больше и б) добавлять их имена в следующую строку:

ComparisonDelegate [] сравнения = новый ComparisonDelegate [] {comp1, comp2};

    delegate bool ComparisonDelegate(string file1, string file2);

    static bool comp1(string file1, string file2) { return true; }
    static bool comp2(string file1, string file2) { return false; }

    ComparisonDelegate[] comparisons = new ComparisonDelegate[] { comp1, comp2 };

    void runComparisons()
    {
        foreach (ComparisonDelegate cd in comparisons)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 100; j++)
                {
                    bool retVal = cd(filesArr1[i], filesArr2[j]);
                }
            }
        }
    }

Надеюсь, вы сможете адаптировать его под костюм

1 голос
/ 18 января 2010

Во-первых, было бы намного быстрее, если бы ваш основной и единственный цикл проходил через 100 файлов, а внутри него вы сравниваете свои 3 файла;) Примерно так:

for( int index = 0; index < 100; index++ )
{
  // then all actions here
}

Далее. Если вам нужно переключиться на другую функцию сравнения после некоторых шагов, вам нужно изменить рабочий делегат на другую функцию. Но нет никакой разницы в том, переключаете ли вы свой делегат или вызываете другую функцию, вам просто нужен еще один вызов функции для третьего файла в вашем случае. Вам нужна лучшая формализация, почему вам нужно переключиться и от чего это зависит.

0 голосов
/ 18 января 2010

Если вы знаете, через сколько итераций вы хотите изменить функцию сравнения, вы можете выполнить базовое условие if (или переключить) без необходимости делегатов:

  if ( 0 < j ) && ( j < 2)
      compare1()
  else
  if (2 < j) && ( j < 10)
     compare2()
  else
     compare3()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...