目的
string[] lines = System.IO.File.ReadAllLines(FILENAME);
としたとき、文字列配列linesが空であるか調べるのに少し迷ったので、メモ程度に書くことにしました。
注意 : ここで言う「空」とは、配列==null
のことではありません。
実行環境
OS : OS X Yosemite 10.10.5
Compiler : Mono 4.2.0
方法1
System.Linq
名前空間の Enumerable.Any
メソッドを使う。
このメソッドは、要素が含まれているかどうかを返します。
要素がある場合はTrue
、ない場合はFalse
を返します。
Enumerrable.Any() - MSDN
if (!lines.Any())
{
Console.WriteLine($"{nameof(lines)}は空です。");
}
方法2
System.Linq
名前空間の Enumerable.Count
メソッドを使い、要素数を調べる。
Enumerable.Count() - MSDN
if (lines.Count() == 0)
{
Console.WriteLine($"{nameof(lines)}は空です。");
}
方法3
Array.Length
プロパティを使って配列の要素数を調べる。
MSDNによると、計算量がO(1)
のようなのでこっちを使ったほうが速いかもしれないですね。
Array.Length - MSDN
if (lines.Length == 0)
{
Console.WriteLine($"{nameof(lines)}は空です。");
}
ベンチマーク
それぞれFor文で10億回ループしてます。
計測用のコードは以下に示します。
using System;
using System.IO;
using System.Linq;
using System.Diagnostics;
using static System.Console;
namespace Test
{
class Program
{
public static void Main(string[] args)
{
int n = 0;
bool b = false;
string[] lines = new string[0];
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000000; i++)
{
/* ここに処理を書く! */
}
sw.Stop();
WriteLine(sw.Elapsed);
}
}
}
コンパイルと実行のコマンドは以下に示します。
mcs Test.cs
mono ./Test.exe
方法1の結果
意外に時間がかかりました。
00:00:51.7555533
For文内の処理は以下のとおりです。
b = lines.Any();
方法2の結果
方法1と比べるとそこそこ速い。
00:00:14.5522226
For文内の処理は以下のとおりです。
n = lines.Count();
方法3の結果
は、速い!
00:00:00.3757821
For文内の処理は以下のとおりです。
n = lines.Length;
まとめ
配列が空であるか調べるなら配列.Length
を使うのが良さそう。