C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

コレクションに、含まれるデータが全て同一であるかどうか /bun (25/07/02(Wed) 09:15) #103747
Re[1]: コレクションに、含まれるデータが全て同一であるかど.. /WebSurfer (25/07/02(Wed) 10:03) #103749
Re[1]: コレクションに、含まれるデータが全て同一であるかど.. /魔界の仮面弁士 (25/07/02(Wed) 09:57) #103748
Re[1]: コレクションに、含まれるデータが全て同一であるかど.. /furu (25/07/02(Wed) 10:15) #103750
  └ Re[2]: コレクションに、含まれるデータが全て同一であるかど.. /bun (25/07/02(Wed) 10:54) #103751 解決済み
    └ Re[3]: コレクションに、含まれるデータが全て同一であるかど.. /魔界の仮面弁士 (25/07/02(Wed) 14:22) #103752 解決済み
      └ Re[4]: コレクションに、含まれるデータが全て同一であるかど.. /bun (25/07/03(Thu) 08:57) #103753 解決済み


親記事 / ▼[ 103749 ] ▼[ 103748 ] ▼[ 103750 ]
■103747 / 親階層)  コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ bun (1回)-(2025/07/02(Wed) 09:15:38)

分類:[C#] 

コレクションに、含まれるデータが全て同一であるかどうかを判定したいです。

処理速度を考えると、別の値が現れた時点で、「全て同一とはなっていない」と返したいです。
これを実現するには、どのようにLINQを使用するのがよさげですか?

listがコレクションだとして...
  list.Distinct().Count() == 1
は直感的ではありますが、全件検索と思われ遅そう(ソートも走る?)。

list.All(x => x == list.FirstOrDefault())
がいいのかなと思いますが、もっといい案とかありますかねぇ?

[ □ Tree ] 返信 編集キー/

▲[ 103747 ] / 返信無し
■103749 / 1階層)  Re[1]: コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ WebSurfer (2958回)-(2025/07/02(Wed) 10:03:04)
No103747 (bun さん) に返信
> コレクションに、含まれるデータが全て同一であるかどうかを判定したいです。

コレクションの要素の型は何で、「同一である」とは具体的にどういう事で
しょうか?

等値演算子 == で比較してますが、比較対象の型によっていろいろ考えなけ
ればならないことがありそうです。

2つの値が等しいか調べる、等値演算子(==)とEqualsメソッドの違い
https://dobon.net/vb/dotnet/beginner/equality.html

等値演算子 - 2 つのオブジェクトが等しいかどうかをテストします
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/equality-operators#equality-operator-
[ 親 103747 / □ Tree ] 返信 編集キー/

▲[ 103747 ] / 返信無し
■103748 / 1階層)  Re[1]: コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ 魔界の仮面弁士 (3856回)-(2025/07/02(Wed) 09:57:15)
No103747 (bun さん) に返信
> コレクションに、含まれるデータが全て同一であるかどうかを判定したいです。
値の一致性ですか? 参照の一致性ですか?

var list = new List<decimal> { 1.23M, 1.2300M };

// これらは False
System.Console.WriteLine( list[0].ToString() == list[1].ToString() );
System.Console.WriteLine( ReferenceEquals( list[0], list[1]) );

// これらは True
System.Console.WriteLine( list[0] == list[1] );
System.Console.WriteLine( list[0].Equals(list[1]) );


> 処理速度を考えると、別の値が現れた時点で、「全て同一とはなっていない」と返したいです。
同一排除なら、最初から List ではなく、HashSet や SortedSet を採用するという選択肢もありますが、
今回は「すべて同じかどうか」ですから、ちょっと状況が異なりますね。

> list.All(x => x == list.FirstOrDefault())
> がいいのかなと思いますが、もっといい案とかありますかねぇ?
これだと FirstOrDefault が毎回呼び出されそうなので
 var f = list.FirstOrDefault();
 return list.All(x => x == f);
じゃないですかね。
[ 親 103747 / □ Tree ] 返信 編集キー/

▲[ 103747 ] / ▼[ 103751 ]
■103750 / 1階層)  Re[1]: コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ furu (242回)-(2025/07/02(Wed) 10:15:50)
No103747 (bun さん) に返信
> list.All(x => x == list.FirstOrDefault())
List<double>の1億件すべて同じ値だった場合
約1.5秒でした。


魔界の仮面弁士さんも書かれていますが
FirstOrDefaultを外に出すと
約0.5秒

LINQでなく、forループなら(forループ使えるなら)
約0.25秒
[ 親 103747 / □ Tree ] 返信 編集キー/

▲[ 103750 ] / ▼[ 103752 ]
■103751 / 2階層)  Re[2]: コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ bun (3回)-(2025/07/02(Wed) 10:54:28)
みなさん、どうもです。

同一であるかどうかは、==演算子の結果(値の比較)で判定とします。

> List<double>の1億件すべて同じ値だった場合
> 約1.5秒でした。
> 
> 魔界の仮面弁士さんも書かれていますが
> FirstOrDefaultを外に出すと
> 約0.5秒
> 
> LINQでなく、forループなら(forループ使えるなら)
> 約0.25秒

全件検索と途中脱出で大きな差があるのは想定しましたが、比較処理の書き方だけで
これだけ差があるのは驚きでした。
LINQ と ループ の処理時間差は誤差程度と思っていましたが、認識を変えたほうが
よさそうです。

ありがとうございました。

解決済み
[ 親 103747 / □ Tree ] 返信 編集キー/

▲[ 103751 ] / ▼[ 103753 ]
■103752 / 3階層)  Re[3]: コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ 魔界の仮面弁士 (3857回)-(2025/07/02(Wed) 14:22:14)
No103751 (bun さん) に返信
> LINQ と ループ の処理時間差は誤差程度と思っていましたが、認識を変えたほうが
> よさそうです。
for と for each の速度差というのもありますね。
基本的には for の方が高速。
https://ufcpp.net/study/csharp/sp_foreach.html#performance
https://ufcpp.net/blog/2018/12/howtoenumerate/

ただしこういう使い方をしたら逆転してしまう模様。
(1回で済むはずのインデクサアクセスを1000回繰り返しているのが原因かな)
https://qiita.com/130cmWolf/items/0a4ecaa92d0ef82d7c7a


解決済み
[ 親 103747 / □ Tree ] 返信 編集キー/

▲[ 103752 ] / 返信無し
■103753 / 4階層)  Re[4]: コレクションに、含まれるデータが全て同一であるかどうか
□投稿者/ bun (4回)-(2025/07/03(Thu) 08:57:25)
なるほど、単純なループ速度なら、for()の方が速いが...
foreachはインデクサ([]演算子)いらずなので、その意味ではforeach()の方が速いと。
奥が深いです。

いずれにせよ、同じ結果を返すと分かっている処理を何度も呼ぶのは速度低下の原因に
なるということですね。
勉強になりました。
解決済み
[ 親 103747 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -