gpt4 book ai didi

c# - 从字符串数组中删除列表中的内容

转载 作者:太空狗 更新时间:2023-10-29 22:19:15 24 4
gpt4 key购买 nike

我有一个字符串数组 x 和一个列表 y,我想从列表 X 中删除 Y 中的所有数据,如何以最快的方式做到这一点?

例如:X:1)“aaa.bbb.ccc”2)“ddd.eee.fff”3) "ggg.hhh.jjj"

是:1) "bb"2) "fff"

结果应该是一个新列表,其中只有 3) 存在,因为 X.1 被 Y.1 删除,X.2 被 Y.2 删除

怎么做?

我知道我可以对列表 X 执行 foreach 并检查列表 Y 中的所有内容,这是最快的方法吗?

最佳答案

方便的是

var Z = X.Where(x => !x.Split('.').Intersect(Y).Any()).ToList();

这与“最快”不同。可能最快(运行时)方法是使用 token 搜索,例如:

public static bool ContainsToken(string value, string token, char delimiter = '.')
{
if (string.IsNullOrEmpty(token)) return false;
if (string.IsNullOrEmpty(value)) return false;

int lastIndex = -1, idx, endIndex = value.Length - token.Length, tokenLength = token.Length;
while ((idx = value.IndexOf(token, lastIndex + 1)) > lastIndex)
{
lastIndex = idx;
if ((idx == 0 || (value[idx - 1] == delimiter))
&& (idx == endIndex || (value[idx + tokenLength] == delimiter)))
{
return true;
}
}
return false;
}

然后是这样的:

var list = new List<string>(X.Length);
foreach(var x in X)
{
bool found = false;
foreach(var y in Y)
{
if(ContainsToken(x, y, '.'))
{
found = true;
break;
}
}
if (!found) list.Add(x);
}

这个:

  • 不分配数组(对于 Split 的输出,对于 params char[]Split )
  • 不创建任何新的string实例(用于 Split 的输出)
  • 不使用委托(delegate)抽象
  • 没有捕获范围
  • 使用struct List<T> 的自定义迭代器而不是 class IEnumerable<T> 的迭代器
  • 开始新的List<T>具有适当的最坏情况大小以避免重新分配

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

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