LoginSignup
22
18

More than 5 years have passed since last update.

C#で文字列配列が空であるか調べる方法

Last updated at Posted at 2015-11-28

目的

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

Example1
if (!lines.Any())
{
    Console.WriteLine($"{nameof(lines)}は空です。");
}

方法2

System.Linq 名前空間の Enumerable.Count メソッドを使い、要素数を調べる。
Enumerable.Count() - MSDN

Example2
if (lines.Count() == 0)
{
    Console.WriteLine($"{nameof(lines)}は空です。");
}

方法3

Array.Lengthプロパティを使って配列の要素数を調べる。
MSDNによると、計算量がO(1)のようなのでこっちを使ったほうが速いかもしれないですね。
Array.Length - MSDN

Example3
if (lines.Length == 0)
{
    Console.WriteLine($"{nameof(lines)}は空です。");
}

ベンチマーク

それぞれFor文で10億回ループしてます。
計測用のコードは以下に示します。

Test.cs
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);
        }
    }
}

コンパイルと実行のコマンドは以下に示します。

command
mcs Test.cs
mono ./Test.exe

方法1の結果

意外に時間がかかりました。

Result1
00:00:51.7555533

For文内の処理は以下のとおりです。

b = lines.Any();

方法2の結果

方法1と比べるとそこそこ速い。

Result2
00:00:14.5522226

For文内の処理は以下のとおりです。

n = lines.Count();

方法3の結果

は、速い!

Result3
00:00:00.3757821

For文内の処理は以下のとおりです。

n = lines.Length;

まとめ

配列が空であるか調べるなら配列.Lengthを使うのが良さそう。

22
18
0

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
22
18