質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

1回答

3287閲覧

C# 入れ子となったList<List<int>>の列ごとに検索する方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2019/05/09 11:01

List<List<int>>でこのような構造を作りました。

C#

1List<List<int>> nestedList = new List<List<int>> 2 { 3 new List<int>{ 4 1,1,3 5 }, 6 new List<int> 7 { 8 2,0,7 9 }, 10 new List<int> 11 { 12 5,1,4 13 }, 14 new List<int> 15 { 16 9,1,8 17 }, 18 new List<int> 19 { 20 15,0,9 21 } 22 };
列1列2列3
113
207
514
918
1509

このとき、列1(1,2,5,9,15)から任意の数を検索して、当てはまる行の2,3列目の数を取得する方法が知りたいです。

例えば、列1に「9」を含む行の2列目の数は「1」、2列目の数は「8」というように取得したいです。

C#

1 int SearchFirst = 9; 2 int ResultSecond = 0; 3 int ResultThird = 0; 4 foreach (var list in nestedList) 5 { 6 if (list[0] == SearchFirst) 7 { 8 ResultSecond = list[1]; 9 ResultThird = list[2]; 10 } 11 } 12 Console.WriteLine($@"SearchFirst = {SearchFirst},ResultSecond = {ResultSecond},ResultThird = {ResultThird}");

のようにforeachで取得もできるのですが、検索が頻繁に行われるためList<int>の数が多くなるとパフォーマンスが心配です。

他に効率の良い検索方法や、そもそもListの入れ子じゃなくてこうしたら検索しやすい、などありましたら教えてください。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/05/09 12:52

> 検索が頻繁に行われるためList<int>の数が多くなるとパフォーマンスが ここをこのまま読むと、1行が列方向に長いように読めるのですが、その場合にどうして検索の頻度やこれによるパフォーマンス遅延になるか分かりません。"List<List<int>>"の数の意味でしょうか? また、検索が頻繁というときの、具体的な要件をお願いします。既に回答にあるように検索対象は1文字目のみなのかなど。
Zuishin

2019/05/09 13:16 編集

要素の型が List<int> なので要素数、つまり行方向という意味だと思います。 条件がこれだけなら YAmaGNZ さんの回答のように Dictionary<TKey, TValue> がベストでしょうか。条件によっては List<T> のままで BinarySearch メソッドを使う方がパフォーマンスが良くなる可能性もありますが。
退会済みユーザー

退会済みユーザー

2019/05/09 16:31

行方向、列方向がどちらなのかわからないのですが、例として示した表が縦方向(下方向)に長くなるということです。 なので要素List<int>の数が多くなるとforeachのループ回数が増えてパフォーマンスが低下するという意図でした。わかりにくくなってしまってすみません。
papinianus

2019/05/09 22:06

Zuishin様、helph様 コメントありがとうございます。単に穿ち過ぎなだけでした。
guest

回答1

0

ベストアンサー

検索するキーが固定で重複しないのであれば、
Dictionary<int,List<int>>にするのはどうでしょう?

投稿2019/05/09 11:40

YAmaGNZ

総合スコア10251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/09 16:31

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問