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

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

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

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

Q&A

解決済

1回答

7431閲覧

IEnumerableを使ったjag配列に要素を追加したい。

sheephuman

総合スコア112

C#

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

0グッド

0クリップ

投稿2016/10/02 10:53

C#勉強中の初心者です。

C# インターフェース - IEnumerable(T)

上記リンクのサンプルで、何故か

C#

1 public bool Add(int row, TSource val, params TSource[] restvals) 2 { 3 // : 4 } 5 6

となっておりまして、ここに本来ジャグ配列の要素を追加するためのメソッドが必要なのだと思いますが、どうすればいいか教えて頂けませんか。調べても分かりません。

サンプルコード

using System; using System.Collections; using System.Collections.Generic; using System.Linq; class JaggedArray<TSource> : IEnumerable<TSource> { System.Collections.IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } private List<TSource>[] _list; public JaggedArray(int rowmax) { _list = new List<TSource>[rowmax]; } public int Add(int row, int val, params int[] restvals) { return; // : } public IEnumerator<TSource> GetEnumerator() { foreach (List<TSource> sublist in _list) { if (sublist != null) { // 子側の配列をイテレート foreach (TSource val in sublist) { yield return val; } } } } } class Program { static string Dump<Tsource>(IEnumerable<Tsource> source) { return "{" + string.Join(", ", source) + "}"; } static void Main() { JaggedArray<int> jagary = new JaggedArray<int>(5); jagary.Add(0, 1); jagary.Add(2, 1, 2, 3, 4); jagary.Add(3, 1, 2); jagary.Add(4, 5); foreach (int it in jagary) { Console.Write("{0} ", it); } Console.WriteLine("\n"); // LINQ Console.WriteLine("Count = {0}", jagary.Count()); Console.WriteLine("3 Contains ? = {0}", jagary.Contains(3)); Console.WriteLine("Max = {1}", jagary.Max()); Console.WriteLine("Sum = {0}", jagary.Sum()); Console.WriteLine("Average = {0}", jagary.Average()); Console.WriteLine("ToArray = {0}", Dump(jagary.ToArray())); Console.WriteLine("(Source) / 2.0 = {0}", Dump(jagary.Select(it => it / 2.0))); } }

上記のコードをVisual Studio2015で走らせると以下のようなエラーが出まして、どうもbool Addメソッドが機能してないように見えます。

イメージ説明

ハンドルされていない例外: System.InvalidOperationException: シーケンスに要素が含まれていません
場所 System.Linq.Enumerable.Max(IEnumerable`1 source)
場所 Program.Main() 場所 D:\code\ConsoleApp5\src\ConsoleApp5\Program.cs:行 79
注: 79行目が jagary.Max()); でした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

恐らく関数の中身を書き忘れたのでしょう。
実際のAddメソッドでは内部配列の指定された位置にTSourceのListを挿入すればいいだけですから以下のようになります。

C#

1public bool Add(int row, //挿入する 2 TSource val, params TSource[] restvals) 3{ 4 //挿入されるリストを作る 5 List<TSource> list = new List<TSource>(); 6 //1個目の要素を追加 7 list.Add(val); 8 //2個目以降の要素を追加 9 list.AddRange(restvals); 10 //作成したリストを追加する 11 this._list[row] = list; 12 return true; 13}

投稿2016/10/02 11:22

grainrigi

総合スコア43

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

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

sheephuman

2016/10/02 11:39

ありがとうございます。全く見当違いなことしてました。 まだ、ハンドルされていない例外: System.FormatException: インデックス (0 ベース) は 0 以上で、引数リストのサイズよりも小さくなければなりません。 などと出るのですが、直し方分かりませんか?
grainrigi

2016/10/02 12:07

呼び出し方を書き忘れていました Add(0, 1個目の要素, 2個目の要素, ...) というように、挿入したい要素をカンマで区切って記述します。 このような書き方でもまだ同様のエラーが発生しますでしょうか?
sheephuman

2016/10/02 12:09

解決しました。 どうも Console.WriteLine("Max = {1}", jagary.Max()); となっていたことに依る単純ミスだったみたいです(おそらく)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問