0
1

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.

【C#】List型変数に指定条件のデータが格納されているかの確認方法

Last updated at Posted at 2022-02-07

結論

Any()を使います。

List<int> dataList = new();

//変数内に2146435071個データを格納する。
dataList.AddRange(Enumerable.Repeat(0, 2146435071));

//リスト内に値が0のデータがあるか調べる
if (dataList.Any(x => x == 0))
{
    Console.WriteLine("値が0のデータあったよ!!");
}

注意すること

下記のソースコードのように実装すると処理速度が大幅に低下します。

やらかしソースコード
List<int> dataList = new();

//変数内に2146435071個データを格納する。
dataList.AddRange(Enumerable.Repeat(0, 2146435071));

//リスト内に値が0のデータがあるか調べる
if (dataList.Count(x => x == 0) != 0)
{
    Console.WriteLine("値が0のデータあったよ!!");
}

Count()とAny()で何が違うのか

Any()の場合は条件に合ったデータが1つでも存在した場合は途中で処理を中断するのに対して、Count()の場合はまず条件に合ったデータをすべて探して、探した結果の数が0個ではないかを確認しています。

処理速度(Any() VS Count())

実際に処理速度がどれくらい違うのかを確認しました。
結果は

種類 実行時間[ms] 格納データ数
Any() 0 1
Count() 5 1
Any() 0 10000
Count() 4 10000
Any() 0 2146435071
Count() 15484 2146435071
検証ソースコード
using System.Diagnostics;

List<int> dataList = new();

//変数内に2146435071個データを格納する。
dataList.AddRange(Enumerable.Repeat(0, 10000));

var sw = new Stopwatch();

sw.Start();

//リスト内に値が0のデータがあるか調べる
if (dataList.Count(x => x == 0) != 0)
{
    sw.Stop();

    Console.WriteLine($"Count()→{sw.ElapsedMilliseconds}[ms]");
}

sw.Restart();

//リスト内に値が0のデータがあるか調べる
if (dataList.Any(x => x == 0))
{
    sw.Stop();

    Console.WriteLine($"Any()→{sw.ElapsedMilliseconds}[ms]");
}

...(´ε` )フムフム
やっぱり処理的に考えてもそりゃAny()の方が早いっすよねー。
じゃあ、Listの最後に0が格納されていてそれ以外が1だった場合はどうなんの?ということで検証してみました。
結果は

種類 実行時間[ms] 格納データ数
Any() 0 1
Count() 0 1
Any() 0 10000
Count() 4 10000
Any() 14942 2146435071
Count() 15356 2146435071

まあ、想像通りでしたね。Any()も結局はList内の要素を順番に取り出して条件に合っているかを確認しているので要素の最後のみ条件に一致した場合は、Count()のやらかしソースコードとほぼ同じ時間がかかるみたいです。

検証ソースコード
using System.Diagnostics;

List<int> dataList = new();

//変数内に2146435070個データを格納する。
dataList.AddRange(Enumerable.Repeat(1, 2146435070));

//最後に0を追加する!
dataList.Add(0);

var sw = new Stopwatch();

sw.Start();

//リスト内に値が0のデータがあるか調べる
if (dataList.Count(x => x == 0) != 0)
{
    sw.Stop();

    Console.WriteLine($"Count()→{sw.ElapsedMilliseconds}[ms]");
}

sw.Restart();

//リスト内に値が0のデータがあるか調べる
if (dataList.Any(x => x == 0))
{
    sw.Stop();

    Console.WriteLine($"Any()→{sw.ElapsedMilliseconds}[ms]");
}

↓結果↓
image.png

ちなみに

インテリセンス君がAny()使えや!と怒ってくれるのでウィッスって従っておけばいいと思います。
image.png

以上!!!

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?