我想在对对象执行"foreach"时,对上一次循环迭代做一些不同的事情.我使用的是Ruby,但C#、Java等也是如此.

  list = ['A','B','C']
  list.each{|i|
    puts "Looping: "+i # if not last loop iteration
    puts "Last one: "+i # if last loop iteration
  }

所需的输出相当于:

  Looping: 'A'
  Looping: 'B'
  Last one: 'C'

显而易见的解决方法是使用'for i in 1..list.length'将代码迁移到for循环,但for-each解决方案感觉更优雅.在循环中编写特殊情况的最优雅方式是什么?用foreach可以吗?

推荐答案

先从referencelast item取一个值,然后在foreach循环中进行比较,怎么样?I am not say that you should do this as I myself would use the index based loop as mentioned by KlauseMeier.很抱歉,我不认识Ruby,所以下面的示例是C#!希望你不介意:-)

string lastItem = list[list.Count - 1];
foreach (string item in list) {
    if (item != lastItem)
        Console.WriteLine("Looping: " + item);
    else    Console.Writeline("Lastone: " + item);
}

我修改了以下代码,以按引用而不是值进行比较(只能使用引用类型而不是值类型).下面的代码应该支持包含相同字符串(但不是相同字符串对象)的多个对象,因为MattChurcy的示例没有指定字符串必须是不同的,我使用了LINQ Last方法,而不是计算索引.

string lastItem = list.Last();
foreach (string item in list) {
    if (!object.ReferenceEquals(item, lastItem))
        Console.WriteLine("Looping: " + item);
    else        Console.WriteLine("Lastone: " + item);
}

上述代码的局限性.(1) 它只能用于字符串或引用类型,不能用于值类型.(2) 同一对象只能在列表中出现一次.可以有包含相同内容的不同对象.文字字符串不能重复使用,因为C#不会为具有相同内容的字符串创建唯一的对象.

我也不傻.我知道应该使用基于索引的循环.当我第一次发布最初的答案时,我已经说过了.在这个问题的context个答案中,我给出了最好的答案.我太累了,无法继续解释这个问题,所以你们可以投票删除我的答案.如果这个消失了,我会很高兴的.谢谢

Ruby相关问答推荐

当一个方法在没有参数的 return 关键字上提前退出时,返回什么值?

ri 和 rdoc 有什么区别

如何替换 ruby​​ 中模式的每个实例?

如何判断 Ruby 文件是否为空?

在 Ruby 中为类添加实例变量

如何记录在 Ruby 程序中调用的每个方法?

在 YAML 变量中包含 jekyll / liquid 模板数据?

使用正则表达式在第一个逗号之前提取文本

将元素添加到 ruby​​ 数组返回新数组

Ruby数组each_slice_with_index?

Ruby 中的p是什么?

Broken pipe (Errno::EPIPE)

STDERR.puts 与 Ruby 中的 puts 有何不同?

相当于 Ruby 中的通过

在 Ruby 脚本中解析命令行参数

正则表达式,如何匹配多行?

Ruby - Array#<< 和 Array#push 之间的区别

Integer 和 Fixnum 有什么区别?

如何在 IRB 中重新加载脚本?

如何在 Ruby 中创建整数循环?