C# 字符串';s方法,比如MiddleIndexOf-可以吗?

C# 字符串';s方法,比如MiddleIndexOf-可以吗?,c#,string,C#,String,我知道如何使用string的方法IndexOf和LastIndexOf。但我想知道是否有可能用某种“中间索引”以“短方式”实现,即介于IndexOf和LastIndexOf之间 要告诉你我的意思,最好的方法是展示一个例子: string str = @"1\2\3\4\5"; 如何从4开始获取上部字符串的一部分(所以是“4\5”)。 这意味着我不能使用IndexOf或LastIndexOf,但我需要类似“BeforeLastIndexOf”的方法 或者不仅如此,假设我想要从3开始的字符串的一部

我知道如何使用string的方法
IndexOf
LastIndexOf
。但我想知道是否有可能用某种“中间索引”以“短方式”实现,即介于
IndexOf
LastIndexOf
之间

要告诉你我的意思,最好的方法是展示一个例子:

string str = @"1\2\3\4\5";
如何从4开始获取上部字符串的一部分(所以是“4\5”)。 这意味着我不能使用IndexOf或LastIndexOf,但我需要类似“BeforeLastIndexOf”的方法

或者不仅如此,假设我想要从3开始的字符串的一部分(即“3\4\5”)。这甚至意味着我不能使用“BeforeLastIndexOf”,但有些不同

--

这意味着:1在LastIndexOf之前,或者2在LastIndexOf之前(或者从前面开始:2在IndexOf之后,或者3在IndexOf之后)

--

我知道我可以用反斜杠分隔符分割字符串,但我想知道是否有任何方法可以使用字符串方法(如所解释的)

大thx提前


再见

您可以提供一个起点。如果结果索引超出了“终点”,则两者之间不存在任何内容

例如,给定字符串:

string str = @"1\2\3\4\5";
如果要限制为
@“4\5”
并查找斜杠的索引:

int index = str.IndexOf(@"\", 6); // Start at char 6, returns 7

你可以提供一个起点。如果结果索引超出了“终点”,则两者之间不存在任何内容

例如,给定字符串:

string str = @"1\2\3\4\5";
如果要限制为
@“4\5”
并查找斜杠的索引:

int index = str.IndexOf(@"\", 6); // Start at char 6, returns 7

没有
MiddleIndexOf
,但两者都有,允许您选择一个点开始搜索

例如:

string str = @"1\2\3\4\5";
//    indexes: 012345678
int index = str.IndexOf('\\', 4);
// index = 5, it starts searching from: "3\4\5"
要获取第二条斜线的索引,您需要执行以下操作:

string str = @"1\2\3\4\5";
int index = str.IndexOf('\\', str.IndexOf('\\') + 1);
要获取最后的第二个斜杠,代码如下:

string str = @"1\2\3\4\5";
int index = str.LastIndexOf('\\', str.LastIndexOf('\\') - 1);

要列出字符串中字符的每个索引,以下扩展方法可以提供帮助:

public static int[] GetAllIndexes(this string @this, string substr)
{
    var indexes = new List<int>();
    int index = -1;
    while ((index = @this.IndexOf('\\', index + 1)) >= 0) indexes.Add(index);
    return indexes.ToArray();
}
public static int[] GetAllIndexes(this string @this, char substr)
{
    var indexes = new List<int>();
    int index = -1;
    while ((index = @this.IndexOf('\\', index + 1)) >= 0) indexes.Add(index);
    return indexes.ToArray();
}

您描述的
BeforeLastIndexOf
函数可能如下所示:

string str = @"1\2\3\4\5";
int[] indexes = str.GetAllIndexes('\\');
public static int BeforeLastIndexOf(this string @this, string substr, int beforeCount)
{
    int index = @this.LastIndexOf(substr, @this.Length - 1);
    for (int i = 0; i < beforeCount && index >= 0; i++)
        index = @this.LastIndexOf(substr, index - 1);
    return index;
}
public static int BeforeLastIndexOf(this string @this, char substr, int beforeCount)
{
    int index = @this.LastIndexOf(substr, @this.Length - 1);
    for (int i = 0; i < beforeCount && index >= 0; i++)
        index = @this.LastIndexOf(substr, index - 1);
    return index;
}
string str = @"1\2\3\4\5";
//    indexes: 0123456789
int index = str.AfterIndexOf('\\', 2);
它将在最后一个索引之前返回两个索引。在这种情况下,它将返回3。(\5是最后一个,然后是\4,然后是\3,之前的\3的索引是3)


您可以使用
IndexOf
执行相同的操作,并在IndexOf之后创建

public static int AfterIndexOf(this string @this, string substr, int afterCount)
{
    int index = @this.IndexOf(substr);
    for (int i = 0; i < afterCount && index >= 0; i++)
        index = @this.IndexOf(substr, index + 1);
    return index;
}
public static int AfterIndexOf(this string @this, char substr, int afterCount)
{
    int index = @this.IndexOf(substr);
    for (int i = 0; i < afterCount && index >= 0; i++)
        index = @this.IndexOf(substr, index + 1);
    return index;
}
这又返回5,即4之前的\


要真正获得MiddleIndexOf,或者使用最接近中间的索引,可以使用以下扩展方法:

public static int MiddleIndexOf(this string @this, string substr, bool roundUp = false, bool preferUp = true)
{
    // Determine the middle character
    int middlePoint = (roundUp ? @this.Length : @this.Length - 1) / 2;

    // Find the indexes closest to the middle
    int indexBelow = @this.LastIndexOf(substr, middlePoint);
    int indexAbove = @this.IndexOf(substr, middlePoint);
    if (indexBelow < 0) return indexAbove;
    if (indexAbove < 0) return indexBelow;

    int diffBelow = middlePoint - indexBelow;
    int diffAbove = indexAbove - middlePoint;

    return diffAbove == diffBelow ? (preferUp ? indexAbove : indexBelow) : // If it's the same difference
        (diffAbove < diffBelow ? indexAbove : indexBelow); // Otherwise return the closest index
}
public static int MiddleIndexOf(this string @this, char substr, bool roundUp = false, bool preferUp = true)
{
    // Determine the middle character
    int middlePoint = (roundUp ? @this.Length : @this.Length - 1) / 2;

    // Find the indexes closest to the middle
    int indexBelow = @this.LastIndexOf(substr, middlePoint);
    int indexAbove = @this.IndexOf(substr, middlePoint);
    if (indexBelow < 0) return indexAbove;
    if (indexAbove < 0) return indexBelow;

    int diffBelow = middlePoint - indexBelow;
    int diffAbove = indexAbove - middlePoint;

    return diffAbove == diffBelow ? (preferUp ? indexAbove : indexBelow) : // If it's the same difference
        (diffAbove < diffBelow ? indexAbove : indexBelow); // Otherwise return the closest index
}
有两个可选参数:

  • roundUp
    :如果设置为true,且字符数为偶数,则将向上取整,否则将向下取整。例如,如果您有8个字符:
    “12345678”
    如果“汇总”为false,它将选择
    4
    作为中间点,否则选择
    5
  • preferUp
    :当一个字符与字符串中的中间点的距离相同时,这将决定它选择哪个字符。默认情况下,它设置为
    true
    ,以补偿向下舍入。(如果您有一个8个字符的字符串
    “\1\2\3\4”
    中间点应该在3.5,但由于这不可能,它将从索引3进行搜索。索引3是
    '2'
    a
    \
    与上面一样远。但由于这是真的,它将选择索引4中距离中间点0.5的字符,否则它将选择下面的索引,即
    1.5
    远离真正的中点。)

没有
MiddleIndexOf
,但两者都有,允许您选择一个点开始搜索

例如:

string str = @"1\2\3\4\5";
//    indexes: 012345678
int index = str.IndexOf('\\', 4);
// index = 5, it starts searching from: "3\4\5"
要获取第二条斜线的索引,您需要执行以下操作:

string str = @"1\2\3\4\5";
int index = str.IndexOf('\\', str.IndexOf('\\') + 1);
要获取最后的第二个斜杠,代码如下:

string str = @"1\2\3\4\5";
int index = str.LastIndexOf('\\', str.LastIndexOf('\\') - 1);

要列出字符串中字符的每个索引,以下扩展方法可以提供帮助:

public static int[] GetAllIndexes(this string @this, string substr)
{
    var indexes = new List<int>();
    int index = -1;
    while ((index = @this.IndexOf('\\', index + 1)) >= 0) indexes.Add(index);
    return indexes.ToArray();
}
public static int[] GetAllIndexes(this string @this, char substr)
{
    var indexes = new List<int>();
    int index = -1;
    while ((index = @this.IndexOf('\\', index + 1)) >= 0) indexes.Add(index);
    return indexes.ToArray();
}

您描述的
BeforeLastIndexOf
函数可能如下所示:

string str = @"1\2\3\4\5";
int[] indexes = str.GetAllIndexes('\\');
public static int BeforeLastIndexOf(this string @this, string substr, int beforeCount)
{
    int index = @this.LastIndexOf(substr, @this.Length - 1);
    for (int i = 0; i < beforeCount && index >= 0; i++)
        index = @this.LastIndexOf(substr, index - 1);
    return index;
}
public static int BeforeLastIndexOf(this string @this, char substr, int beforeCount)
{
    int index = @this.LastIndexOf(substr, @this.Length - 1);
    for (int i = 0; i < beforeCount && index >= 0; i++)
        index = @this.LastIndexOf(substr, index - 1);
    return index;
}
string str = @"1\2\3\4\5";
//    indexes: 0123456789
int index = str.AfterIndexOf('\\', 2);
它将在最后一个索引之前返回两个索引。在这种情况下,它将返回3。(\5是最后一个,然后是\4,然后是\3,之前的\3的索引是3)


您可以使用
IndexOf
执行相同的操作,并在IndexOf
之后创建

public static int AfterIndexOf(this string @this, string substr, int afterCount)
{
    int index = @this.IndexOf(substr);
    for (int i = 0; i < afterCount && index >= 0; i++)
        index = @this.IndexOf(substr, index + 1);
    return index;
}
public static int AfterIndexOf(this string @this, char substr, int afterCount)
{
    int index = @this.IndexOf(substr);
    for (int i = 0; i < afterCount && index >= 0; i++)
        index = @this.IndexOf(substr, index + 1);
    return index;
}
这又返回5,即4之前的\


要真正获得MiddleIndexOf,或者使用最接近中间的索引,可以使用以下扩展方法:

public static int MiddleIndexOf(this string @this, string substr, bool roundUp = false, bool preferUp = true)
{
    // Determine the middle character
    int middlePoint = (roundUp ? @this.Length : @this.Length - 1) / 2;

    // Find the indexes closest to the middle
    int indexBelow = @this.LastIndexOf(substr, middlePoint);
    int indexAbove = @this.IndexOf(substr, middlePoint);
    if (indexBelow < 0) return indexAbove;
    if (indexAbove < 0) return indexBelow;

    int diffBelow = middlePoint - indexBelow;
    int diffAbove = indexAbove - middlePoint;

    return diffAbove == diffBelow ? (preferUp ? indexAbove : indexBelow) : // If it's the same difference
        (diffAbove < diffBelow ? indexAbove : indexBelow); // Otherwise return the closest index
}
public static int MiddleIndexOf(this string @this, char substr, bool roundUp = false, bool preferUp = true)
{
    // Determine the middle character
    int middlePoint = (roundUp ? @this.Length : @this.Length - 1) / 2;

    // Find the indexes closest to the middle
    int indexBelow = @this.LastIndexOf(substr, middlePoint);
    int indexAbove = @this.IndexOf(substr, middlePoint);
    if (indexBelow < 0) return indexAbove;
    if (indexAbove < 0) return indexBelow;

    int diffBelow = middlePoint - indexBelow;
    int diffAbove = indexAbove - middlePoint;

    return diffAbove == diffBelow ? (preferUp ? indexAbove : indexBelow) : // If it's the same difference
        (diffAbove < diffBelow ? indexAbove : indexBelow); // Otherwise return the closest index
}
有两个可选参数:

  • roundUp
    :如果设置为true,且字符数为偶数,则将向上取整,否则将向下取整。例如,如果您有8个字符:
    “12345678”
    如果“汇总”为false,它将选择
    4
    作为中间点,否则选择
    5
  • preferUp
    :当一个字符与字符串中的中间点的距离相同时,这将决定它选择哪个字符。默认情况下,它设置为
    true
    ,以补偿向下舍入。(如果您有一个8个字符的字符串
    “\1\2\3\4”
    中间点应该在3.5,但由于这不可能,它将从索引3进行搜索。索引3是
    '2'
    a
    \
    与上面一样远。但由于这是真的,它将选择索引4中距离中间点0.5的字符,否则它将选择下面的索引,即
    1.5
    远离真正的中点。)

如果知道第一个字符的索引,可以使用
string.IndexOf(value,startIndex)
开始搜索第一个字符后的下一个实例

此代码将获取第二个字符的索引:

public int static SecondIndexOf(this string str, char value)
{
    var firstIndex = str.IndexOf(char);
    if (firstIndex == -1)
        return firstIndex;

    return str.IndexOf(char, firstIndex + 1);
}

如果知道第一个字符的索引,可以使用
string.IndexOf(value,startIndex)
开始搜索第一个字符后的下一个实例

此代码将获取第二个字符的索引:

public int static SecondIndexOf(this string str, char value)
{
    var firstIndex = str.IndexOf(char);
    if (firstIndex == -1)
        return firstIndex;

    return str.IndexOf(char, firstIndex + 1);
}

万一我不知道反斜杠之间的字符数呢?@Mitj