我正在使用 .NET Framework 4.7.2 探索 System.Numerics.Vector(我正在处理的项目无法迁移到 .NET Core 3 并使用新的 Intrinsics 命名空间)。该项目正在处理非常大的 CSV/TSV 文件,我们花费大量时间遍历字符串以查找逗号、引号等,我正在努力加快进程。
到目前为止,我已经能够使用 Vector 来识别字符串是否包含给定字符(使用 EqualsAny 方法)。这很好,但我想更进一步。我想使用 Vector 有效地找到该字符的索引。我不知道怎么。下面是我用来确定字符串是否包含逗号的函数。
private static readonly char Comma = ',';
public static bool HasCommas(this string s)
{
if (s == null)
{
return false;
}
ReadOnlySpan<char> charSpan = s.AsSpan();
ReadOnlySpan<Vector<ushort>> charAsVectors = MemoryMarshal.Cast<char, Vector<ushort>>(charSpan);
foreach (Vector<ushort> v in charAsVectors)
{
bool foundCommas = Vector.EqualsAny(v, StringExtensions.Commas);
if (foundCommas)
{
return true;
}
}
int numberOfCharactersProcessedSoFar = charAsVectors.Length * Vector<ushort>.Count;
if (s.Length > numberOfCharactersProcessedSoFar)
{
for (int i = numberOfCharactersProcessedSoFar; i < s.Length; i++)
{
if (s[i] == ',')
{
return true;
}
}
}
return false;
}
我知道我可以使用上面的函数并扫描生成的向量,但这会破坏使用向量的目的。我听说新的 Intrinsics 库可以提供帮助,但我无法将我的项目升级到 .NET Core 3。
给定一个向量,你如何有效地找到一个字符的位置?有没有我不知道的聪明把戏?