gpt4 book ai didi

c# - 从字符串中删除字符

转载 作者:可可西里 更新时间:2023-11-01 07:51:13 26 4
gpt4 key购买 nike

我有一个字符串

string Text = "012345678901234567890123456789";

和一个带索引的 List<int>

List<int> Indexes = new List<int>() { 2, 4, 7, 9, 15, 18, 23, 10, 1, 2, 15, 40 };

有以下限制

  • 列表中有重复项
  • 列表未排序
  • 可能有索引 > Text.length

从索引列表中的文本中删除字符的最佳方法是什么?

预期输出:

035681234679012456789

有没有比

更有效的方法
foreach (int index in Indexes
.OrderByDescending(x => x)
.Distinct()
.Where(x => x < Text.Length))
{
Text = Text.Remove(index, 1);
}

更新:以下是当前答案的基准(100.000 个字符的 string 和长度为 10.000 的 List<int>:

Gallant: 3.322 ticks
Tim Schmelter: 8.602.576 ticks
Sergei Zinovyev: 9.002 ticks
rbaghbanli: 7.137 ticks
Jirí Tesil Tesarík: 72.580 ticks

最佳答案

这是一种或多或少优雅的 LINQ 方式:

Text = new string(Text.Where((c, index) => !Indexes.Contains(index)).ToArray());

它使用了 Enumerable.Where 的重载投影序列中项目的索引。

如果您想要最高效但不是最易读的方式并且文本非常大,您可以使用 HashSet<int>而不是不允许重复的列表和 StringBuilder创建新字符串:

var indexSet = new HashSet<int>(Indexes); // either create from the list(as shown here) or use it without your list
var textBuilder = new StringBuilder(Text.Length);

for(int i = 0; i < Text.Length; i++)
if (!indexSet.Contains(i))
textBuilder.Append(Text[i]);
Text = textBuilder.ToString();

当然你也可以使用 HashSet<int>在 LINQ 方法中提高效率。

关于c# - 从字符串中删除字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36550284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com