为什么他们使用这种C#语法在ASP.NET MVC 2中创建链接列表?

qua*_*els 5 c# asp.net asp.net-mvc asp.net-mvc-2

我很难理解下面的C#代码.此代码取自Steven Sanderson的Pro ASP.NET MVC 2 Framework.代码基本上根据类别列表创建URL.

这是代码:

        Func<string, NavLink> makeLink = categoryName => new NavLink { 
            Text = categoryName ?? "Home", 
            RouteValues = new RouteValueDictionary(new { 
                controller = "Products", 
                action = "List", 
                category = categoryName, 
                page = 1 
            }),
            IsSelected = (categoryName == currentCategory)
Run Code Online (Sandbox Code Playgroud)

很多东西都在这里发生.我猜它正在定义一个函数,它需要两个类型为string和NavLink的参数.然后我看到Lambda categoryName => new NavLink etc....我认为它所做的只是创建一个实例NavLink.

然后在同一个Controller动作中调用该函数:

        // Place home link on top
        List<NavLink> navLinks = new List<NavLink>();
        navLinks.Add(makeLink(null));

        // Add link for each distinct category
        var categories = productsRepository.Products.Select(x => x.Category.Name);
        foreach (string categoryName in categories.Distinct().OrderBy(x => x))
            navLinks.Add(makeLink(categoryName));
Run Code Online (Sandbox Code Playgroud)

我可以说它正在制作一个NavLink列表.我不明白为什么史蒂文桑德森这样写道.难道他没有写过类似的东西:

var categories = productsRepository.Products.Select(x => x.Category.Name);
foreach (string categoryName in categories.Distinct().OrderBy(x => x))
{
    var newlink = new Navlink{
        text = categoryName,
        RouteValues = new RouteValueDictionary(new {
           controller = "Products",
           action = "List",
           category = categoryName,
           page = 1
        }),
        IsSelected = (categoryName == currentCategory)
    }
    navLinks.Add(newlink);
}
Run Code Online (Sandbox Code Playgroud)

史蒂文与我的方式相比有什么优势吗?

Mar*_*ade 5

看起来他想要使用一个本地函数,可以用来添加home链接和类别循环的一部分.如果他像你一样在线进行,那么他只需要为单个主链接重复相同的代码.