【问题标题】:Why is one List returning 26 items and another returning 1?为什么一个 List 返回 26 个项目而另一个返回 1?
【发布时间】:2021-10-18 12:31:19
【问题描述】:
var result = new List<QuickSearchModel>();
var Navmenus = CommonConstants.GetNavItems();
var items = new List<NavMenuItem>();
Navmenus.ForEach(it =>
{
    if (it.IsNested)
    {
        it.menuItems.ForEach(mi => items.Add(new NavMenuItem() { Name = it.Name + "/" + mi.Name, Link = mi.Link }));
    }
    else { 
        items.Add(new NavMenuItem() { Name = it.Name, Link = it.Link });
        result.Add(new QuickSearchModel() { Id = "1", Title = it.Name, ItemType = it.Name, Route = it.Link });
    }
});
return result;

在我返回结果时,我的代码块结束时,我期待 26 项。 在我的即时窗口中,我键入 items,我看到列出了 26 个 NavMenuItem 当我输入 result 时,我看到列出了 1 个 QuickSearchModel(我的项目列表中的第 3 个)

请看这两张图片作为参考

解决方案:

我最终做到了

    public static List<QuickSearchModel> PageListFromNavMenu()
    {            
        var Navmenus = CommonConstants.GetNavItems();
        var items = new List<NavMenuItem>();
        Navmenus.ForEach(it =>
        {
            if (it.IsNested)
            {
                it.menuItems.ForEach(mi => items.Add(new NavMenuItem() { Name = it.Name + "/" + mi.Name, Link = mi.Link }));
            }
            else { 
                items.Add(new NavMenuItem() { Name = it.Name, Link = it.Link });                    
            }
        });            
        return PageListFromNavMenu(items);
    }
    private static List<QuickSearchModel> PageListFromNavMenu(List<NavMenuItem> items)
    {
        var result = new List<QuickSearchModel>();
        items.ForEach(it =>
        {
            result.Add(new QuickSearchModel() { Id="1", Title = it.Name, ItemType = it.Name, Route = it.Link });
        });
        return result;
    }

很遗憾,我不得不通过第二个 For 循环来获得结果,但它确实奏效了。我希望我可以在 else 块中完成它。

【问题讨论】:

  • 因为“else”被执行一次,“it.menuItems.ForEach in if”被执行了 25 次(或者更确切地说 (Navmenus.Count - 1) * (it.menuItems.Count) 给了 25)?
  • else 块执行 25 次。这就是我感兴趣的代码块。这是一个很好的观察。我确实添加了 2 张图片以供参考。
  • 您只返回result 列表。 items 列表从未使用过。

标签: c# list linq enumeration


【解决方案1】:

为什么要创建一个 NavMenuItems 列表只是为了将其转换为 QuickSearchModels 列表?在您的第一个方法中创建 QuickSearchModels(永远不要创建中间 List&lt;NavMenuItem&gt;

public static List<QuickSearchModel> PageListFromNavMenu()
{            
    var Navmenus = CommonConstants.GetNavItems();
    var items = new List<QuickSearchModel>();
    Navmenus.ForEach(it =>
    {
        if (it.IsNested)
        {
            foreach (var mi in it.menuItems) {
                string name = it.Name + "/" + mi.Name;
                items.Add(new QuickSearchModel {
                    Id = "1",
                    Title = name,
                    ItemType = name,
                    Link = mi.Link
                });
            }
        }
        else { 
            items.Add(new QuickSearchModel {
                Id = "1",
                Title = it.Name,
                ItemType = it.Name,
                Link = it.Link
            });
        }
    });            
    return items;
}

【讨论】:

    【解决方案2】:

    嗯...因为代码是这样说的。如果 NavMenu-item 是嵌套的,则将某些内容添加到项目集合中,否则将其添加到项目和结果集合中。显然你有一个根元素和 25 个子项。

    【讨论】:

    • 我添加了一张图片。请看图片。如果项目与项目相同,则它应该具有相同的编号。对吗?
    • 在 IF 块内放断点,在 ELSE 块内放断点。数一数你打了多少次。
    • 我做到了。我打了 25 次。
    • 是的,先生。我打了 else 块 25 次。我的菜单中只有 3 个顶级菜单和几个项目。我的一份菜单里有 25 道菜。
    • 没错,这里的问题肯定来自ForEach扩展方法,试试foreach(var it in Navmenus) { ... }
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2018-11-04
    • 1970-01-01
    • 2020-07-04
    • 2021-12-21
    • 2012-07-09
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多