none
Поиск в строке RRS feed

  • Вопрос

  • Есть массив строк с hex данными, например:

    string[] data = new string[] {"1B", "2C", "01", "11", "3F", "5F", "02", "01", "11","2F", "3C"};
    
    

     Необходимо найти элемент "01", затем проверить идет ли за ним эелемент "11", если так то берем эту последовательность до следующего "01" и "11" и так далее. Должны получится последовательности: "01113F5F02" и "01112F3C", только надо чтобы еще каждая строка представлялась массивом.

    Я сделал сейчас вот так:

    public static List<string[]> SplitAndCombine(IEnumerable<string> source, string delimiter)
     {
      List<string> result = new List<string>();
    
      StringBuilder current = null;
    
      foreach (string item in source.SkipWhile(x => x != delimiter))
      {
      if (item == delimiter)
      {
       if (current != null)
       {
       result.Add(current.ToString());
       }
       current = new StringBuilder();
      }
      current.Append(item);
      }
      if (current != null)
      {
      result.Add(current.ToString());
      }
      // теперь в result находятся последовательности
    
      // разбиваем теперь каждые два символа и добавляем в массив
      List<string[]> mes = new List<string[]>();
      //int k = 0;
      for (int i = 0; i < result.Count; i++)
      {
      int k = 0;
      string[] temp = new string[result[i].Length / 2];
      for (int j = 0; j < result[i].Length - 1; j += 2)
      {
       temp[k] = result[i].Substring(j, 2);
       k++;
      }
      mes.Add(temp);
      }
      return mes;
     }
    
    Код ужасен, помогите переписать, и он ищет только по одному разделителю, т.е "01" и все, и не проверяет следует ли за ним "11".
    1 декабря 2010 г. 14:13

Ответы

  • А почему бы Вам из массив строк не сделать всего одну строку?

    "1B2C01113F5F0201112F3C"

    А потом  в этой строке ( c помощью её методов) искать нужную Вам подстроку "0111" ...


    • Предложено в качестве ответа PashaPashModerator 1 декабря 2010 г. 23:31
    • Помечено в качестве ответа Abolmasov Dmitry 3 декабря 2010 г. 7:34
    1 декабря 2010 г. 17:10
  • Не понятно зачем тебе delimiter если тебе необходимо найти "01" и следом "11".

    Предлагаю следуещее

    public static List<string[]> SplitAndCombine(IEnumerable<string> source, string delimiter)
        {
          List<string[]> result = new List<string[]>();
          List<string> util = new List<string>();
          
          bool add = false;
          IEnumerator<string> str = source.GetEnumerator();
    
          while (str.MoveNext())
          {
            if ((str.Current == delimiter) && add)
            {
              add=false;
              string[] s = new string[util.Count];
              util.CopyTo(s);
              result.Add(s);
              util = new List<string>();
            }
    
            if (str.Current == delimiter) 
            {
              util.Add(str.Current);
              if (str.MoveNext())
                if (str.Current == "11")
                {
                  util.Add(str.Current);
                  add = true;
                  continue;
                }
            }
    
            if (add) util.Add(str.Current);
    
          }
          if (add)
          {
            string[] s = new string[util.Count];
            util.CopyTo(s);
            result.Add(s);
          }
    
          return result;
        }
    сообши если не поможет
    • Помечено в качестве ответа Abolmasov Dmitry 3 декабря 2010 г. 7:34
    1 декабря 2010 г. 19:02

Все ответы

  • А почему бы Вам из массив строк не сделать всего одну строку?

    "1B2C01113F5F0201112F3C"

    А потом  в этой строке ( c помощью её методов) искать нужную Вам подстроку "0111" ...


    • Предложено в качестве ответа PashaPashModerator 1 декабря 2010 г. 23:31
    • Помечено в качестве ответа Abolmasov Dmitry 3 декабря 2010 г. 7:34
    1 декабря 2010 г. 17:10
  • Не понятно зачем тебе delimiter если тебе необходимо найти "01" и следом "11".

    Предлагаю следуещее

    public static List<string[]> SplitAndCombine(IEnumerable<string> source, string delimiter)
        {
          List<string[]> result = new List<string[]>();
          List<string> util = new List<string>();
          
          bool add = false;
          IEnumerator<string> str = source.GetEnumerator();
    
          while (str.MoveNext())
          {
            if ((str.Current == delimiter) && add)
            {
              add=false;
              string[] s = new string[util.Count];
              util.CopyTo(s);
              result.Add(s);
              util = new List<string>();
            }
    
            if (str.Current == delimiter) 
            {
              util.Add(str.Current);
              if (str.MoveNext())
                if (str.Current == "11")
                {
                  util.Add(str.Current);
                  add = true;
                  continue;
                }
            }
    
            if (add) util.Add(str.Current);
    
          }
          if (add)
          {
            string[] s = new string[util.Count];
            util.CopyTo(s);
            result.Add(s);
          }
    
          return result;
        }
    сообши если не поможет
    • Помечено в качестве ответа Abolmasov Dmitry 3 декабря 2010 г. 7:34
    1 декабря 2010 г. 19:02
  • А почему бы Вам из массив строк не сделать всего одну строку?

    "1B2C01113F5F0201112F3C"

    А потом  в этой строке ( c помощью её методов) искать нужную Вам подстроку "0111" ...


    Что-то вроде:

        IEnumerable<string> getarr(string source)
        {
          int start = 0;
    
          while (start < source.Length)
          {
            yield return source.Substring(start, 2);
            start += 2;
          }
        }
    
        IEnumerable<string[]> SplitAndCombine(IEnumerable<string> source, IEnumerable<string> delimiters)
        {
          string jsouurse = String.Join("", source);
          string jdel = String.Join("", delimiters);
    
          int start = 0;
    
          int index = jsouurse.IndexOf(jdel, start); // первое совпадение
          while (index != -1)
          {
            start = index;
            index = jsouurse.IndexOf(jdel, start + 1); // последующие
    
            if (index != -1)
              yield return getarr(jsouurse.Substring(start, index - start)).ToArray();
            else
              yield return getarr(jsouurse.Substring(start)).ToArray();
          }
        }
    


    Для связи [mail]
    2 декабря 2010 г. 5:07