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

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

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

コレクションに、含まれるデータが全て同一であるかどうか

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■103747 / inTopicNo.1)  コレクションに、含まれるデータが全て同一であるかどうか
  
□投稿者/ bun (1回)-(2025/07/02(Wed) 09:15:38)

分類:[C#] 

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

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

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

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

引用返信 編集キー/
■103748 / inTopicNo.2)  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);
じゃないですかね。
引用返信 編集キー/
■103749 / inTopicNo.3)  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-
引用返信 編集キー/
■103750 / inTopicNo.4)  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秒
引用返信 編集キー/
■103751 / inTopicNo.5)  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 と ループ の処理時間差は誤差程度と思っていましたが、認識を変えたほうが
よさそうです。

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

解決済み
引用返信 編集キー/
■103752 / inTopicNo.6)  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


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ