C# 如何有效地找到系统中的值索引。数值。向量<;T>;?

C# 如何有效地找到系统中的值索引。数值。向量<;T>;?,c#,.net,vector,vectorization,system.numerics,C#,.net,Vector,Vectorization,System.numerics,我正在使用.NET Framework 4.7.2探索System.Numerics.Vector(我正在处理的项目还不能迁移到.NET Core 3并使用新的Intrinsics命名空间)。该项目正在处理非常大的CSV/TSV文件,我们花了很多时间在字符串中循环查找逗号、引号等,我正在尝试加快这个过程 到目前为止,我已经能够使用Vector来识别字符串是否包含给定字符(使用EqualsAny方法)。那太好了,但我想再进一步。我想使用向量有效地找到该字符的索引。我不知道怎么做。下面是我用来确定字

我正在使用.NET Framework 4.7.2探索System.Numerics.Vector(我正在处理的项目还不能迁移到.NET Core 3并使用新的Intrinsics命名空间)。该项目正在处理非常大的CSV/TSV文件,我们花了很多时间在字符串中循环查找逗号、引号等,我正在尝试加快这个过程

到目前为止,我已经能够使用Vector来识别字符串是否包含给定字符(使用EqualsAny方法)。那太好了,但我想再进一步。我想使用向量有效地找到该字符的索引。我不知道怎么做。下面是我用来确定字符串是否包含逗号的函数

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;
}
private静态只读字符逗号=',';
公共静态bool有逗号(此字符串为s)
{
如果(s==null)
{
返回false;
}
ReadOnlySpan charSpan=s.AsSpan();
ReadOnlySpan charAsVectors=MemoryMarshal.Cast(charSpan);
foreach(字符向量中的向量v)
{
bool foundCommas=Vector.EqualsAny(v,StringExtensions.Commas);
if(逗号)
{
返回true;
}
}
int numberOfCharactersProcessedSoFar=charAsVectors.Length*Vector.Count;
如果(s.Length>numberOfCharactersProcessedSoFar)
{
for(int i=numberOfCharactersProcessedSoFar;i
我知道我可以使用上面的函数扫描得到的向量,但这会破坏使用向量的目的。我听说新的Intrinsics库可能会有所帮助,但我无法将我的项目升级到.NETCore3


给定一个向量,如何有效地找到角色的位置?有没有一个我不知道的聪明技巧?

这是C#和CIL的局限性之一。投诉时间很长,没有相关的新功能,无法避免
switch
类分支。因为
struct
的标准与C/C++不同。如果不标记字段偏移和打包,运行时可以重新调整
结构
内存以进行优化。因此,无法通过内存偏移安全地访问字段。所以C#不支持相关的语法。有什么原因让你用vector来查找字符串中字符的索引吗?还有更简单的方法。我使用Vector来加速字符串处理。Vector使用SIMD(),它允许在一条指令中处理多个数据点(本例中为字符)。为什么不将SIMD与并行性结合使用?我认为您可以将字符串拆分为(例如)10个字符串,并在并行任务中对所有字符串运行SIMD方法,并使用
Task。当出现
@armanebrahinpur时,我理解您的建议,但我只关注一行。如何识别逗号在哪里被赋予一个字符串?如果我能够使用SIMD实现这一点,这将比创建和管理线程快得多。