none
из С++ в C# RRS feed

  • Вопрос

  • Привет, есть код на С++, помогите переделать на C#, особенно реализация функции search(из пространства std). желательно чтоб distance имел тип ArrayList

    for (long k = 2; k < 6; k++)
    		for (long i = 0; i < clrtext.size()-2*k; i++)
    		{
    			findtext.clear();
    			for (long j = i; j <= i+k; j++)
    			{
    				findtext.push_back(clrtext[j]);
    			}
    
    			it = search (clrtext.begin()+i+k+1, clrtext.end(),
    						findtext.begin(), findtext.end());
    
    			if ( it != clrtext.end())
    			{
    				distance.push_back( int(it - clrtext.begin())-i );
    			}
    		}
    distance, findtext - это vector<int>
    it это итератор.

    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 22:05 MSDN Forums consolidation (От:Visual C#)
    14 апреля 2010 г. 10:30

Ответы

  • Прямогоаналога методу search C++ в .net нет, нужно реализовать самому.

    Вот реализация где в виде векторов выступают списки List<int>, я не стал использовать ArrayList, но переделать несложно.

    Собственно Method - это ваш загадочный код, а search - мое видение того, как должна работать функция search. Итератов в С# нет, поэтому использовались индексы в списке

      class Program
      {
        static void Main(string[] args)
        {
          //тестирование метода search
          List<int> lst = new List<int>(){1, 2, 3, 7, 3, 4, 5, 2, 3, 5, 1, 2, 3, 3, 4,1, 2, 3};
          List<int> lstf = new List<int>() { 2, 3, 10 };
          //Ищем последовательность {2, 3} из lstf в списке lst в диапазоне индексов [4, 10]
          Console.WriteLine("Found at: " + search(lst, 4, 10, lstf, 0, 1).ToString());
    
          //Переделка вашего кода
          foreach (var item in Method(lst))
          {
            Console.WriteLine(item);
          }
    
        }
    
        static List<int> Method(List<int> clrtext)
        {
          int it = 0;
          List<int> distance = new List<int>();
          List<int> findText = new List<int>();
    
          for (long k = 2; k < 6; k++)
          {
            for (long i = 0; i < clrtext.Count - 2 * k; i++)
            {
              findText.Clear();
              for (long j = i; j <= i + k; j++)
              {
                findText.Add(clrtext[(int)j]);
              }
              it = search(clrtext, (int)(i + k + 1), clrtext.Count - 1, findText, 0, findText.Count - 1);
              if (it != -1)
              {
                distance.Add((int)(it - i));
              }
            }
          }
          return distance;
        }
    
        /// <summary>
        /// Ищет в последовательности чисел первое вхождение другой последовательности чисел
        /// </summary>
        /// <param name="lstWhereSearch">Список в котором проиходит посик</param>
        /// <param name="whereSearchStartInd">Индекс в исходном списке, указывающую начальную позицию поиска</param>
        /// <param name="whereSearchEndInd">Индекс в исходном списке, указывающий конечную позицию поиска</param>
        /// <param name="lstWhatSearch">Последоовательность чисел, которая ищется в исходном списке</param>
        /// <param name="whatSearchStartInd">Индекс в последовательности, с которого начинается поиск</param>
        /// <param name="whatSearchEndInd">Индекс в последовательности, на котором заканчивается поиск</param>
        /// <returns>Возвращает индекс в исходном списке, по которому найдена подпоследовательность, если 
        /// подпоследовательность не найде - вернет -1</returns>
        static int search(List<int> lstWhereSearch, int whereSearchStartInd, int whereSearchEndInd, 
          List<int> lstWhatSearch, int whatSearchStartInd, int whatSearchEndInd)
        {
          
          //Находит последовательность lstFind в исходном списке lst начиная с позиции startIndex в исх. списке
          //Если совпадение найдено, возв. индекс, иначе -1
          Func<List<int>, int, List<int>, int> findSubList = delegate(List<int> lst, int startIndex, List<int> lstFind)
          {
            for (int i = 0; i < lstFind.Count; i++)
            {
              if (i + startIndex > lst.Count - 1)
              {
                return -1;
              }
              else if (lst[i + startIndex] != lstFind[i])
              {
                return -1;
              }
            }
            return startIndex;
          };
          //Создаем временный список, выделяющий нужную подпоследовательность для удобства
          List<int> templst = new List<int>();
          for (int i = whatSearchStartInd; i <= whatSearchEndInd; i++)
    			{
            templst.Add(lstWhatSearch[i]);
    			}
    
          //Проходимся по каждому элементу исходного списка, и если нашли совпадение с первым элементом
          //последовательности, то вызываем делегат FindSubList проводящий поиск последовательности в
          //исходном списке, начиная с данной позиции
          for (int i = whereSearchStartInd; i <= whereSearchEndInd; i++)
          {
            if ( lstWhereSearch[i] == templst[0])
            {
              int ind = findSubList(lstWhereSearch, i, templst);
              if (ind >= 0)
              {
                return ind;
              }
            }
          }
          return -1;
        }
      }

    • Помечено в качестве ответа sharok 16 апреля 2010 г. 10:39
    16 апреля 2010 г. 8:36

Все ответы

  • Прямогоаналога методу search C++ в .net нет, нужно реализовать самому.

    Вот реализация где в виде векторов выступают списки List<int>, я не стал использовать ArrayList, но переделать несложно.

    Собственно Method - это ваш загадочный код, а search - мое видение того, как должна работать функция search. Итератов в С# нет, поэтому использовались индексы в списке

      class Program
      {
        static void Main(string[] args)
        {
          //тестирование метода search
          List<int> lst = new List<int>(){1, 2, 3, 7, 3, 4, 5, 2, 3, 5, 1, 2, 3, 3, 4,1, 2, 3};
          List<int> lstf = new List<int>() { 2, 3, 10 };
          //Ищем последовательность {2, 3} из lstf в списке lst в диапазоне индексов [4, 10]
          Console.WriteLine("Found at: " + search(lst, 4, 10, lstf, 0, 1).ToString());
    
          //Переделка вашего кода
          foreach (var item in Method(lst))
          {
            Console.WriteLine(item);
          }
    
        }
    
        static List<int> Method(List<int> clrtext)
        {
          int it = 0;
          List<int> distance = new List<int>();
          List<int> findText = new List<int>();
    
          for (long k = 2; k < 6; k++)
          {
            for (long i = 0; i < clrtext.Count - 2 * k; i++)
            {
              findText.Clear();
              for (long j = i; j <= i + k; j++)
              {
                findText.Add(clrtext[(int)j]);
              }
              it = search(clrtext, (int)(i + k + 1), clrtext.Count - 1, findText, 0, findText.Count - 1);
              if (it != -1)
              {
                distance.Add((int)(it - i));
              }
            }
          }
          return distance;
        }
    
        /// <summary>
        /// Ищет в последовательности чисел первое вхождение другой последовательности чисел
        /// </summary>
        /// <param name="lstWhereSearch">Список в котором проиходит посик</param>
        /// <param name="whereSearchStartInd">Индекс в исходном списке, указывающую начальную позицию поиска</param>
        /// <param name="whereSearchEndInd">Индекс в исходном списке, указывающий конечную позицию поиска</param>
        /// <param name="lstWhatSearch">Последоовательность чисел, которая ищется в исходном списке</param>
        /// <param name="whatSearchStartInd">Индекс в последовательности, с которого начинается поиск</param>
        /// <param name="whatSearchEndInd">Индекс в последовательности, на котором заканчивается поиск</param>
        /// <returns>Возвращает индекс в исходном списке, по которому найдена подпоследовательность, если 
        /// подпоследовательность не найде - вернет -1</returns>
        static int search(List<int> lstWhereSearch, int whereSearchStartInd, int whereSearchEndInd, 
          List<int> lstWhatSearch, int whatSearchStartInd, int whatSearchEndInd)
        {
          
          //Находит последовательность lstFind в исходном списке lst начиная с позиции startIndex в исх. списке
          //Если совпадение найдено, возв. индекс, иначе -1
          Func<List<int>, int, List<int>, int> findSubList = delegate(List<int> lst, int startIndex, List<int> lstFind)
          {
            for (int i = 0; i < lstFind.Count; i++)
            {
              if (i + startIndex > lst.Count - 1)
              {
                return -1;
              }
              else if (lst[i + startIndex] != lstFind[i])
              {
                return -1;
              }
            }
            return startIndex;
          };
          //Создаем временный список, выделяющий нужную подпоследовательность для удобства
          List<int> templst = new List<int>();
          for (int i = whatSearchStartInd; i <= whatSearchEndInd; i++)
    			{
            templst.Add(lstWhatSearch[i]);
    			}
    
          //Проходимся по каждому элементу исходного списка, и если нашли совпадение с первым элементом
          //последовательности, то вызываем делегат FindSubList проводящий поиск последовательности в
          //исходном списке, начиная с данной позиции
          for (int i = whereSearchStartInd; i <= whereSearchEndInd; i++)
          {
            if ( lstWhereSearch[i] == templst[0])
            {
              int ind = findSubList(lstWhereSearch, i, templst);
              if (ind >= 0)
              {
                return ind;
              }
            }
          }
          return -1;
        }
      }

    • Помечено в качестве ответа sharok 16 апреля 2010 г. 10:39
    16 апреля 2010 г. 8:36
  • спасибо, буду разбираться
    16 апреля 2010 г. 10:39