【问题标题】:Lambda ForEach() Index PositionLambda ForEach() 索引位置
【发布时间】:2009-01-09 06:16:56
【问题描述】:

这有点 asp.net MVC 相关,仅用于示例目的,但我希望实现这样的目标:

new SelectList(ViewData.Model.Formats.ToList().ForEach(x => index + " - " + x.Name), "ID", "Name");

基本上尝试变得聪明并将“索引”作为数字 1 返回 - n 其中 n 是列表中的项目数 ViewData.Model.Formats 所以我的选择列表每个条目都有一个 # 前缀。有什么简单的方法可以做到这一点,还是我正在考虑使用该附加项创建一个新列表并放弃 lambda 技巧?

【问题讨论】:

    标签: asp.net-mvc lambda


    【解决方案1】:

    您可以使用 LINQ 的 Select 可以为您提供每个元素的索引这一事实:

    new SelectList(ViewData.Model.Formats.Select((x, i) => (i + 1) + " - " + x.Name, "ID", "Name");
    

    请注意,这并不意味着任何数据库访问,只是标准 LINQ to Objects。

    【讨论】:

    • Great Neil,您能否更新您的示例以在选择中包含“ID”?
    【解决方案2】:

    怎么样

    int index = 0;
    new SelectList(ViewData.Model.Formats.ForEach(x => ++index + " - " + x.Name), "ID", "Name");
    

    (我只尝试了捕获 index 的 lambda 表达式。我不知道其他类。)

    【讨论】:

    • 我喜欢你的风格!但是,我似乎什至无法为“x.Name”分配一些东西 ForEach(x => x.Name = "test") 返回错误。也许您不能在 forEach() 中重新分配? :S
    • 你可以做一个赋值(只要x是一个类),但是我不知道ViewData.Model.Formats的结构,所以很抱歉我在这里帮不了你.还要检查尼尔的答案。我认为这更好。
    • Hosam,是的,'x' 是一个类,但作业说明了“无法将 void 转换为 IEnumerable”或其他内容,并且不允许这样做。
    【解决方案3】:

    在 Neil 和 Hosam 的大力帮助下,我完成了以下工作:

    new SelectList(ViewData.Model.MessageTypeFieldFormats.Select((x, i) => new { ID = x.ID, Name = (i + 1) + " - " + x.Name })
    

    匿名方法摇滚!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2022-01-07
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多