如何查找数组中特定字母的单词索引?

问题描述 投票:0回答:1

我有一个字符串列表,我可以在其中添加标签。
一个标签包含一行、源和目标。
标签示例:L02_FTxx10_STxx5
L02 -> 线
FTxx10 -> 来源
STxx5 -> 目标

我将每个标签拆分为一个数组,然后在列表中添加行/源/目标。
问题是源并不总是在同一个地方,所以我不能使用数组的静态索引。
标签示例:L02_word_word_FTxx10_word_STxx5
源中始终包含“xx”。所以我想找到第一个包含“xx”的字符串的索引。

我可以使用“Array.IndexOf”吗?如果是,怎么办?
或者还有别的办法吗?

我的代码:

            foreach (string s in TagLijst)
            {
                int index = -1;
                string[] tempArr = s.Split('_');
                index = Array.IndexOf(???);

                if (!Line.Contains(tempArr[0])) { Line.Add(tempArr[0]); }
                if (!Source.Contains(tempArr[index])) { Source.Add(tempArr[index]); }
                if (!Target.Contains(tempArr.Last())) { Target.Add(tempArr.Last()); }
                Array.Clear(tempArr);
            } 
c# arrays string indexof
1个回答
0
投票

不幸的是,由于您将标签存储在字符串中而不是更复杂的数据结构(例如自定义类)中,因此您将需要测试子字符串的各个字符串段(在您的情况下为“xx”)。但是,有一些方法可以提高效率。

根据您的问题,标签以 Line 开头,包含零个或多个单词,列出 Source,包含零个或多个单词,并以 Target 结尾。 Line、Source 和 Target 都是定义的(它们必须出现在每个标签中)。至此,我们已经可以从源问题中排除第一个和最后一个元素了。

(此时,我要小心,但您可以修改我的答案以使功能更好。)源以一些字符开头,包含字符串“xx”,并以更多字符结束。这种识别特征使我们能够迭代数组并获得正确的索引。

string[] arr = s.Split("_");
int index = arr.Length - 2; // skip last item since that is Target
for (; i > 0; i--)
    if (arr[i].Contains("xx"))
        break;

从你的例子中,我假设第一部分中会有更多

_word_
,所以我从后到前发送搜索。如果是相反的情况,或者你不知道,你可以反向搜索。一旦识别出数组中包含子字符串“xx”的元素,循环就会终止并存储当前索引。之后就可以随意使用了。

一些进一步的说明:

  • 如果您想要更小的占用空间,您可以使用
    for
    for (; i > 0 && !arr[i].Contains("xx"); i--);
    循环压缩为一行,但为了便于阅读,我建议不要这样做。
  • 如果您要测试的许多字符串包含许多无关的单词,并且您知道 Source 必须始终是特定长度(在您的示例中为 6),则在元素包含的内容之前测试元素的长度 (
    .Length
    ) 可以缩短搜索时间通过一些计算机周期。这是因为字符串的长度存储为属性,只需要快速查找,而
    .Contains
    是一个函数,必须实际测试元素的字符,需要多次计算。但只有当这些单词数量很多时才应该添加;否则
    .Length
    查找总计将比仅从
    .Contains
    开始更昂贵。
  • 如果源始终以包含“xx”的某些字符(在您的示例中为“FTxx”)开头,请使用
    .StartsWith
    而不是
    .Contains
    。这是因为一旦条件失败,
    .StartsWith
    就会返回
    false
    ,而
    .Contains
    必须检查整个字符串(减去测试子字符串的长度)才能返回
    false
© www.soinside.com 2019 - 2024. All rights reserved.