【发布时间】:2021-09-05 17:39:50
【问题描述】:
我有 2 个列表(myItems 和 anotherItems),我想查看 myItems 上的项目是否在 anotherItems 上?
我目前正在使用 2 个 foreach 循环,但是速度很慢,大约需要 1 分钟。
myItems = IEnumerable<SomeModel>
另一个项目 = IEnumerable<String>
foreach (var item in myItems)
{
foreach (var subItem in anotherItems)
{
var parsed = ParseItem(subItem, item.Id);
if (parsed.Id != null && parsed.version != null)
{
if (item.Id.Equals(parsed.Id, StringComparison.OrdinalIgnoreCase))
{
myList.Add(new myModel
{
Name = item.Name,
Id = item.Id,
Version = parsed.version
});
break;
}
}
}
}
而 PareItem 是:
public static (string Id, string version) ParseItem(string line, string Id)
{
line = Regex.Replace(line, "[ ]{2,}", " ", RegexOptions.IgnoreCase);
line = Regex.Replace(line, $@".*(?=({Regex.Escape(Id)}))", "", RegexOptions.IgnoreCase);
var lines = line.Split(" ");
if (lines.Count() == 2)
{
return (Id: lines[0], version: lines[1]);
}
return (Id: null, version: null);
}
我怎样才能更快地做到这一点?
【问题讨论】:
-
你能对你的输入数据做一些假设吗?例如,它们是否已排序?
-
那里有大量不必要的字符串操作。使用捕获组甚至简单的 IndexOf。显示您的输入数据
-
此外,您重新解析相同的项目 N 次,其中 N 是外部列表中的项目数 - 这完全是浪费时间。使用任何看起来像 Id 的东西将内部列表解析为 Hashset 并遍历外部列表,询问该集合是否包含该项目
-
大多数情况下,识别最佳数据表示然后选择正确的算法将比优化我们已经看到的代码带来更大的性能提升。在此之后,
parsed.Id和parsed.version当前是字符串标识符。它们是字符串还是表示为字符串的数值?parsed.Id模式可以是“abc123”还是总是类似于“123”?version也是如此。 -
@DanielDearlove 你可以在我的问题中看到它