結論
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]");
}
ちなみに
インテリセンス君がAny()
使えや!と怒ってくれるのでウィッスって従っておけばいいと思います。
以上!!!