0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

配列を順次取り出すfor命令の比較

Last updated at Posted at 2020-05-04

GW中はどこにも行けないので、のんびり家でJavaを勉強しています。
rubyのeach文は優秀で、どこにでも使えるのがうれしいので多用してしまいます。ruby使っているともはやrubyでfor文ってどう書くんだっけ?って感じです。
たとえば、配列の中身を出力するとき、こんな書き方ができます。

fruits.rb
fruits = ["りんご", "みかん", "バナナ"]
fruits.each do |v|
  print "#{v}\n"
end

これがC#でfor文で書くならこんな感じです。

fruits1.cs
var fruits = new string[] {"りんご", "みかん", "バナナ"};
for (int i = 0; i < fruits.Length; i++)
{
	Console.WriteLine(fruits[i]);
}

for文のカウンタで配列のインデックスを回して要素を取り出すオーソドックスな方法です。
そして、Rubyのeachみたいな記法でforeach文というのがあって、こんな感じ書けます。

fruits2.cs
var fruits = new string[] {"りんご", "みかん", "バナナ"};
foreach (var v in fruits)
{
	Console.WriteLine(v);
}

foreach文はIEnumerableまたはIEnumerable<T>インタフェースを実装しているクラスの要素を取り出すことができます。配列はIEnumerableを実装しているので使えるとのことのようです。List<T>などもIEnumerable<T>を実装しているので使えます。

Javaの場合は拡張for文というのがあるらしくて、こう書くようです。

fruits.java
var fruits = new String[] {"りんご", "みかん", "バナナ"};
for (var v : fruits)
{
	System.out.println(v);
}

うーん、わかりづらい。
foreachではなくて同じforで書くんですね。

なお、C#の場合は、Listを使ってラムダ式を使うともう少しスマートに同じことができます。

fruits3.cs
var fruits = new List<string> {"りんご", "みかん", "バナナ"};
fruits.ForEach(v => Console.WriteLine(v));

ちなみに、今回の主旨とは異なりますが、ただ配列の中身を改行して出力するだけならJoinで十分ですけどね。

fruits4.cs
var fruits = new List<string> {"りんご", "みかん", "バナナ"};
Console.WriteLine(string.Join("\n", fruits.ToArray()));

個人的には原点であるrubyの記法がお気に入りです。

fruits.rb
fruits = ["りんご", "みかん", "バナナ"]
print fruits.join("\n")
0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?