如果我不知道它是什么字符,如何从 c# 中的字符串中删除每三个字符?
How do I remove every third character from a string in c# If I don't know what character it is?
此代码应在不知道字符串数据包含哪些字符的情况下从字符串数据变量中删除每隔三个字符和最后一个字符。
问题是,如果字符串数据的长度是3个字符,这段代码运行良好,但如果超过,那么要删除的字符将不会被删除。
如果我将 x == Data.Length
替换为 x == 3
,然后如果我 运行 字符串数据变量中的代码包含三个以上字符,我会收到 运行 时间错误.
int x = 0;
for (int i = 0; i < Data.Length; i++)
{
x++;
if (x == Data.Length - i) //3
{
Data = Data.Remove(i, i - 1);
Data = Data.Remove(Data.Length - 1);
x = 0;
}
}
您可以尝试将 lambda Where
与您的逻辑一起使用,这将得到一个 IEnumerable<char>
然后传入字符串构造方法得到结果。
var result = Data.Where((x,i)=> i%3 != 2 && i != Data.Length -1).ToArray();
Data = new string(result);
这有帮助吗?
for (int i = 0; i < Data.Length; i++)
{
if((i+1)%3==0)
{
Data = Data.Remove(i, 1);
}
}
我建议使用 Linq Where() combined with the remainder 运算符来收集索引 1 或 2、4 或 5 等处的字符:
var Data = "123456789abcdef";
Data = string.Join("", Data.Where((c, i) => (i+1) % 3 > 0));
工作 .NET Fiddle:https://dotnetfiddle.net/DlSiiY
您可以将所需的字符累积到一个 StringBuilder 中,然后砍掉最后一个:
string datum = "123456789";
var sb = new System.Text.StringBuilder();
for (int i = 0; i < datum.Length; i++)
{
if (i % 3 != 2)
{
sb.Append(datum[i]);
}
}
sb.Length--; // Remove last char
datum = sb.ToString();
Console.WriteLine(datum);
输出:
12457
StringBuilder 内部工作的方式比重复连接到字符串更有效。
您可以利用 .Chunk()
, which lets you split up your string in chunks of (in your scenario) three chars, and of .SkipLast()
,它可以让您跳过每个块中的最后一个 char
。最后,加入所有 char
以创建您的输出字符串。
var output = string.Join(string.Empty,
input.Chunk(3).SelectMany(ch => ch.SkipLast(1)));
输入
var input = "12345678901234567890123456789";
会产生
1245780134679023568
.Chunk()
和 .SkipLast()
都在 System.Linq
命名空间中。
示例 fiddle here.
另一个使用 List<char>
并向后移动:
string input = "1234567890";
List<char> values = new List<char>(input.ToCharArray());
values.RemoveAt(values.Count - 1);
for(int i=(values.Count-1); i>=0; i--)
{
if ((i+1) % 3 == 0)
{
values.RemoveAt(i);
}
}
string output = new string(values.ToArray());
Console.WriteLine(" input: " + input);
Console.WriteLine("output: " + output);
此代码应在不知道字符串数据包含哪些字符的情况下从字符串数据变量中删除每隔三个字符和最后一个字符。
问题是,如果字符串数据的长度是3个字符,这段代码运行良好,但如果超过,那么要删除的字符将不会被删除。
如果我将 x == Data.Length
替换为 x == 3
,然后如果我 运行 字符串数据变量中的代码包含三个以上字符,我会收到 运行 时间错误.
int x = 0;
for (int i = 0; i < Data.Length; i++)
{
x++;
if (x == Data.Length - i) //3
{
Data = Data.Remove(i, i - 1);
Data = Data.Remove(Data.Length - 1);
x = 0;
}
}
您可以尝试将 lambda Where
与您的逻辑一起使用,这将得到一个 IEnumerable<char>
然后传入字符串构造方法得到结果。
var result = Data.Where((x,i)=> i%3 != 2 && i != Data.Length -1).ToArray();
Data = new string(result);
这有帮助吗?
for (int i = 0; i < Data.Length; i++)
{
if((i+1)%3==0)
{
Data = Data.Remove(i, 1);
}
}
我建议使用 Linq Where() combined with the remainder 运算符来收集索引 1 或 2、4 或 5 等处的字符:
var Data = "123456789abcdef";
Data = string.Join("", Data.Where((c, i) => (i+1) % 3 > 0));
工作 .NET Fiddle:https://dotnetfiddle.net/DlSiiY
您可以将所需的字符累积到一个 StringBuilder 中,然后砍掉最后一个:
string datum = "123456789";
var sb = new System.Text.StringBuilder();
for (int i = 0; i < datum.Length; i++)
{
if (i % 3 != 2)
{
sb.Append(datum[i]);
}
}
sb.Length--; // Remove last char
datum = sb.ToString();
Console.WriteLine(datum);
输出:
12457
StringBuilder 内部工作的方式比重复连接到字符串更有效。
您可以利用 .Chunk()
, which lets you split up your string in chunks of (in your scenario) three chars, and of .SkipLast()
,它可以让您跳过每个块中的最后一个 char
。最后,加入所有 char
以创建您的输出字符串。
var output = string.Join(string.Empty,
input.Chunk(3).SelectMany(ch => ch.SkipLast(1)));
输入
var input = "12345678901234567890123456789";
会产生
1245780134679023568
.Chunk()
和 .SkipLast()
都在 System.Linq
命名空间中。
示例 fiddle here.
另一个使用 List<char>
并向后移动:
string input = "1234567890";
List<char> values = new List<char>(input.ToCharArray());
values.RemoveAt(values.Count - 1);
for(int i=(values.Count-1); i>=0; i--)
{
if ((i+1) % 3 == 0)
{
values.RemoveAt(i);
}
}
string output = new string(values.ToArray());
Console.WriteLine(" input: " + input);
Console.WriteLine("output: " + output);