C# 字符串';s方法,比如MiddleIndexOf-可以吗?
我知道如何使用string的方法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开始的字符串的一部
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