如果我不知道字符串是什么字符,如何在 c# 中删除每三个字符?



此代码应从字符串数据变量中删除每三个字符和最后一个字符,而代码不知道字符串数据包含哪些字符。

问题是,如果字符串数据的长度为 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;
}
}

您可以将所需的字符累积到 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 在内部工作的方式比重复连接到字符串更有效。

您可以尝试将lambdaWhere与您的逻辑一起使用,这将获得一个IEnumerable<char>然后传入字符串构造方法得到结果。

var result = Data.Where((x,i)=> i%3 != 2 && i != Data.Length -1).ToArray();
Data = new string(result);

您可以利用.Chunk(),它允许您将字符串拆分为(在您的场景中)三个字符的块,以及.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命名空间中找到。

示例小提琴在这里。

这有帮助吗?

for (int i = 0; i < Data.Length; i++)
{
if((i+1)%3==0)
{
Data = Data.Remove(i, 1);
}
}    

我建议将 Linq Where() 与余数运算符结合使用来收集索引 1 或 2、4 或 5 等处的字符:

var Data = "123456789abcdef";
Data = string.Join("", Data.Where((c, i) => (i+1) % 3 > 0));

工作 .NET 小提琴:https://dotnetfiddle.net/DlSiiY

另一个使用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);

最新更新