我有一个字符串列表,我可以在其中添加标签。
一个标签包含一行、源和目标。
标签示例: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);
}
不幸的是,由于您将标签存储在字符串中而不是更复杂的数据结构(例如自定义类)中,因此您将需要测试子字符串的各个字符串段(在您的情况下为“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--);
循环压缩为一行,但为了便于阅读,我建议不要这样做。.Length
) 可以缩短搜索时间通过一些计算机周期。这是因为字符串的长度存储为属性,只需要快速查找,而.Contains
是一个函数,必须实际测试元素的字符,需要多次计算。但只有当这些单词数量很多时才应该添加;否则 .Length
查找总计将比仅从 .Contains
开始更昂贵。.StartsWith
而不是 .Contains
。这是因为一旦条件失败,.StartsWith
就会返回false
,而.Contains
必须检查整个字符串(减去测试子字符串的长度)才能返回false
。