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

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

ただいまの
回答率

90.23%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,064

sheephuman

score 46

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

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

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

public bool Add(int row, TSource val, params TSource[] restvals)
    {
        // :
    }


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

サンプルコード

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()); でした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/02 20:39

    ありがとうございます。全く見当違いなことしてました。

    まだ、ハンドルされていない例外: System.FormatException: インデックス (0 ベース) は 0 以上で、引数リストのサイズよりも小さくなければなりません。

    などと出るのですが、直し方分かりませんか?

    キャンセル

  • 2016/10/02 21:07

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

    キャンセル

  • 2016/10/02 21:09

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

    キャンセル

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る