c# - 重构函数,使其为 O(N)
问题描述
我为下拉树获取一堆类别,并且必须在此下拉列表中实现搜索。如果其中一个元素匹配,它还应该让所有父级显示在下拉层次结构中。
我从过滤掉匹配项的 2 个foreach
循环开始,在一个循环中检查匹配parentId
项并递归添加父项,直到没有剩余 ( parentId == 0
)。
public ScrapCategory[] Filter(ScrapCategory[] categories, string searchString)
{
var result = new List<ScrapCategory>();
foreach (ScrapCategory category in categories)
{
if (category.Description.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0)
result.Add(category);
if (category.ParentId == 0)
continue;
ScrapCategory currentParent = categories.Where(x => x.Id == category.ParentId).First();
if (!result.Contains(currentParent))
result.Add(currentParent);
while (currentParent?.ParentId > 0)
{
currentParent = categories.Where(x => x.Id == currentParent.ParentId)?.First();
if (!result.Contains(currentParent))
result.Add(currentParent);
}
}
return result.OrderBy(x => x.Level).ToArray();
}
我得到了预期的结果,但我希望在 O(N) 中看到这一点,因此在categories
没有这些.Where()
子句的情况下只有一次交互。
编辑:我设法摆脱了一个.Where()
条款。
public ScrapCategory[] Filter(ScrapCategory[] categories, string searchString)
{
var result = new List<ScrapCategory>();
foreach (ScrapCategory category in categories)
{
if (category.Description.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0)
result.Add(category);
if (category.ParentId > 0)
{
int parentId = category.ParentId;
while (parentId > 0)
{
var parent = categories.Where(x => x.Id == parentId)?.First();
if (!result.Contains(parent))
result.Add(parent);
parentId = parent.ParentId;
}
}
}
return result.OrderBy(x => x.Level).ToArray();
}
解决方案
这是我的最终结果,我很满意。
public ScrapCategory[] Filter(ScrapCategory[] categories, string searchString)
{
var lookup = categories.ToDictionary(category => category.Id);
var result = new HashSet<ScrapCategory>();
foreach (ScrapCategory category in categories)
{
if (category.Description.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0)
result.Add(category);
int parentId = category.ParentId;
while (parentId > 0)
{
ScrapCategory parent = lookup[parentId];
if (!result.Add(parent))
break;
parentId = parent.ParentId;
}
}
return result.OrderBy(n => n.Level).ToArray();
}
推荐阅读
- r - 传单图像未在 Shinyapp 中显示
- flutter - 如何制作迷你有状态小部件以随时间添加新点?
- security - 在 Misp 中找到 IoC
- c# - 如何从 /mnt/secret-store/DataAccessSettings--ConnectionSettings--ConnectionString 读取机密
- google-pagespeed - 在不同国家运行 PageSpeed Insight Api
- javascript - 如何使用 Bootstrap modals 和 jQuery 实现可重用的确认对话框?
- visual-studio-code - 为什么 Neovim 不突出显示整个语法?
- javascript - 使用拆分函数创建动态函数
- apache-spark - 如何在 pyspark 上安装 LZO 和 BROTLI 等各种压缩编解码器?
- amazon-web-services - Terraform 中的条件集参数