预先考虑每个元素,但它们可能会重复

时间:2013-11-22 22:25:06

标签: c# parsing foreach

我有一组标签可能会在控制台中显示为颜色标签。其中有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++;
}

我有什么:     text =“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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在处理完标签后,将其从“文本”字符串中删除后怎么样? 您还可以使用IndexOf值使用for(int i;;i)结构。 (对不起,他到底在哪里发表评论按钮呢?)