2013-11-22 5 views
1

У меня есть массив тегов, которые могут отображаться в консоли как цветовые метки. Их 37 человек.Перед каждым элементом, но они могут повторяться

Итак, я этот код:

tagsCT является строкой []

foreach (string tag in tagsCT) 
{ 
    if (text.Contains(tag)) 
    { 
    ArrayList x = new ArrayList(); 
    x.Add(tag); 
    x.Add(tagsColorValues[k]); 
    tagss.Add(text.IndexOf(tag)); 
    tags.Add(text.IndexOf(tag) - 1, x); 
    } 
k++; 
} 

Что я имею: текст = «2013-11-11 17:56:14 [INFO] $ 4/time: $ 5Изменяет время в каждом мире » Что мне нужно сделать, это найти все цветовые метки в строке. Все возможные из них являются в строке массива []

tagsCT = { "$1","$2","$3","$4" } 

я показываю его в качестве примера, но теги не всегда одинаковой длины. Но проблема забастовки в таких ситуациях:

text = "2013-11-11 17:56:14 [INFO] $4/time: $5Changes the time on each $4world" 

не будет обнаружен последний тег. Вопрос в том, как его предотвратить.

+2

Я не могу расшифровать вопрос здесь. Что ты пытаешься сделать? – paqogomez

+1

дайте пример проблемы, набор данных – Jason

+0

Почему бы не попробовать общий словарь: Словарь или наоборот - кажется, что вы просто хотите подсчитать случаи - я бы подумал о том, чтобы сканировать строку по индексу, если это помогает (зависит от того, как исполняемый код должен быть) – Charleh

ответ

2

Вы можете использовать Dictionary<string, IList<int>> вместо:

var tagIndices = new Dictionary<string, IList<int>>(); 
foreach (string tag in tagsCT) 
{ 
    IList<int> indices; 
    if (tagIndices.TryGetValue(tag, out indices)) 
     continue; // to prevent the same indices on duplicate tags, you could also use a HashSet<string> instead of the array 
    else 
    { 
     indices = new List<int>(); 
     tagIndices.Add(tag, indices); 
    } 
    int index = text.IndexOf(tag); 
    while (index >= 0) 
    { 
     indices.Add(index); 
     index = text.IndexOf(tag, index + 1); 
    } 
} 

Каждый тег хранится как ключ и значение список индексов (может быть пустым).

Вот demonstration

+0

Да, но что, если теперь в этом строком текст есть два одинаковых тега? – niklon

+0

@niklon: Итак, массив содержит повторяющиеся теги, почему? Однако это не вызывает исключения, но индексы будут добавляться многократно. Если вы этого не хотите, вам нужно либо использовать «HashSet » вместо вашего массива (для предотвращения дублирования), либо вам нужно добавить блок 'else' в' if', который просто «продолжит' '' foreach'. –

+0

Я не упоминал об этом в вопросе, но мне нужно, чтобы Key был IndexOf каждого тега, потому что тогда я собираюсь разобраться во всем и начать парсинг цвета. Значение для каждого ключа должно быть тегом как строкой, а соответствующий цветной тег. – niklon

1

Как насчет того, что после обработки тега удалите его из строки «текст»? Вы также можете использовать структуру for(int i;;i), используя значение IndexOf. (извините, где он, черт возьми кнопку комментировать то?)

+0

Это уничтожило бы весь мой текущий синтаксический анализ, я использовал это, но мне действительно не понравилось решение. – niklon

+1

Возможно, это потому, что у вас еще нет оценки в 50 баллов, требуемой для комментариев. Как добраться. – paqogomez

+0

Да, он находится здесь, на других комментариях, но не на главном вопросе, –

Смежные вопросы