【问题标题】:Iterate and update BindingList items using a one-liner使用单线迭代和更新 BindingList 项
【发布时间】:2012-10-11 23:06:13
【问题描述】:

我有一个 BindingList 我想更新某些项目,但是为了使用仅适用于 ListForeach 我必须用 BindingList 项初始化一个新的 List。像这样:

new List<ScanData>(ScanDataList)
.FindAll(i => i.Badge == badge)
.ForEach(x =>x.EmpName = empname);

这是我发现的最简单的方法,但我不想从 New 关键字开始,有没有其他更简单的方法来迭代 BindingList items 并使用像上面这样的单行来更新它们? (为了便于阅读,我把它分成三行)。 我只想删除 New 关键字,但这不起作用, 如果一个新函数有帮助,那也是可以接受的,如果它对任何 BindingList 的泛型都是完美的。

  • 注意:我使用的是紧凑型框架 2.0
  • 我不想初始化我不会使用的变量。

谢谢。

【问题讨论】:

    标签: list foreach compact-framework bindinglist compact-framework2.0


    【解决方案1】:

    这个问题有点傻。没有理由你必须在一行代码中完成它并避免声明一个变量。如果你使用 new 操作符,你就是在初始化一个对象的实例,不管你是否为它声明一个变量。

    话虽如此,我不知道你的 ScanDataList 是什么......有一个相当于 FindAll 的 linq 表达式,称为 Where 可能比 FindAll 更有效(因为它不必创建新列表,它只是懒惰迭代)。如果您的 ScanDataList 已经是 IEnumerable 那么您可能可以做这样的事情......

    ScanDataList.Where(i => i.Badge == badge).ToList().ForEach(x=>x.EmpName = empname);

    即使您的 ScanDataList 不可枚举,您也可以实现自己的扩展方法来帮助您完成此任务,但是对于无需任意不必要的约束(没有新的,没有变量等)。

    所以澄清一下,我可能会使用 .Where LINQ 表达式,因为它可能更高效,因为它不需要创建新列表。但是,使用相同的逻辑,我可能会避免 ToList() 并将您的代码分成两行类似的东西。

    foreach(Employee emp in ScanDataList.Where(i => i.badge == badge))
      emp.EmpName = empname;
    

    这样,不会创建额外的列表。

    【讨论】:

    • 感谢您抽出宝贵的时间来回答,但由于我无法使用您建议的代码,我就 +1 吧。问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多