代码之家  ›  专栏  ›  技术社区  ›  Ian

LINQ与传统的基于集合的方法的优缺点

  •  4
  • Ian  · 技术社区  · 16 年前

    由于对.net游戏相对较新,我想知道,有没有人有过使用LINQ和使用列表/集合的更传统方法之间的利弊经验?

    对于我正在处理的项目的一个特定示例:正在从远程web服务检索唯一id/名称对的列表。

    • 此列表将不经常更改(每天一次),
    • 从使用它的应用程序的角度来看,将是只读的
    • 将存储在应用程序级别,以供所有访问请求使用

    考虑到这些因素,我计划在应用程序级别将返回的值存储在一个单例类中。

    我最初的方法是迭代从远程服务返回的列表,并将其存储在singleton类中的NameValueCollection中,使用基于id从集合中检索的方法:

    sugarsoap soapService = new sugarsoap();
    branch_summary[] branchList = soapService.getBranches();
    
    foreach (branch_summary aBranch in branchList)
    {
        branchNameList.Add(aBranch.id, aBranch.name);
    }
    

    使用LINQ的另一种方法是简单地添加一个方法,该方法在检索列表后直接在列表上工作:

    public string branchName (string branchId) 
    {
        //branchList populated in the constructor
        branch_summary bs = from b in branchList where b.id == branchId select b;
        return branch_summary.name;
    }
    

    两者中有一个比另一个好——有第三种方法吗?我对所有答案都持开放态度,无论是在提供优雅的解决方案方面,还是在有利于性能的解决方案方面。

    4 回复  |  直到 15 年前
        1
  •  3
  •   John Boker    16 年前

    我不认为你写的linq可以编译,它必须是

    public string branchName (string branchId) 
    {
        //branchList populated in the constructor
        branch_summary bs = (from b in branchList where b.id == branchId select b).FirstOrDefault();
        return branch_summary == null ? null : branch_summary.name;
    }
    

    请注意.FirstsOrDefault()

    我宁愿使用LINQ,因为它可以在其他地方使用,可以在数据上编写更复杂的过滤器。我还认为它比NameValueCollection更容易阅读。

    那是我的0.02美元

        2
  •  1
  •   Sam Harwell    15 年前

    如果算法足够简单,可以在没有Linq的情况下编写和维护,并且不需要延迟求值, Linq没有提供足够的可维护性改进,所以不要使用它。然而,有时Linq 极大地 提高了代码的可读性和正确性,如我发布的两个示例所示 here here

        3
  •  0
  •   Rob Stevenson-Leggett    16 年前

    这两种解决方案都是可行的。我认为LINQ将更快地在构造函数中填充集合(但不会明显更快)。传统的基于收集的方法很好。就个人而言,我会选择LINQ版本,因为它是新技术,我喜欢使用它。假设您的部署环境具有.NET 3.5。。。

    您的Web服务上有通过Id获取分支的方法吗?如果不经常需要分支信息,这将是第三种选择。

        4
  •  0
  •   YoryeNathan    12 年前

    缩短和加工:

    public string BranchName(string branchId) 
    {
        var bs = branchList.FirstOrDefault(b => b.Id == branchId);
    
        return bs == null ? null : bs.Name;
    }