2016-05-18 1 views
-3

以下は、インデクサーを使用して、年齢に基づいてリスト<内の人を検索する3つのクラスの非常に基本的なプログラムです。以下はC#Console Programインデクサーは、私のリストの最初の項目のみを見つけます。<>

Person.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Indexer1 
{ 
    public class Indexer 
    { 
     List<Person> per = new List<Person>(); 

     public Indexer() 
     { 
      per.Add(new Person("Joe", "Soap", 25)); 
      per.Add(new Person("Marry", "Jane", 82)); 
      per.Add(new Person("Garry", "Zuma", 37)); 
      per.Add(new Person("Nelson", "Mabaso", 14)); 
     } 

     public Person this[int indexes] 
     { 
      get 
      { 
       foreach (Person item in per) 
       { 
        if (item.Age == indexes) 
        { 
         return item; 
        } 
        else 
        { 
         return null; 
        } 
       } 
       return null; 
      } 
      set 
      { 
       per[indexes] = value; 
      } 
     } 
    } 
} 

のProgram.cs以下は、検索を可能にし、見つけるために、インデクサーをインスタンス化します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Indexer1 
{ 
    public class Person 
    { 
     private string name; 
     private string surname; 
     private int age; 

     public int Age 
     { 
      get { return age; } 
      set { age = value; } 
     } 


     public string Surname 
     { 
      get { return surname; } 
      set { surname = value; } 
     } 


     public string Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     public override string ToString() 
     { 
      return string.Format("{0} {1} {2}", name, surname, age); 
     } 

     public Person(string name, string surname, int age) 
     { 
      this.name = name; 
      this.surname = surname; 
      this.age = age; 

     } 
    } 
} 

Indexer.cs

は以下ごと>一覧<で人をインスタンス化します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Indexer1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Indexer ind = new Indexer(); 

      Console.WriteLine("enter in age of person you are searching for"); 
      int age = int.Parse(Console.ReadLine()); 

      Console.WriteLine(); 
      Console.WriteLine("{0} {1} {2}", ind[age].Name, ind[age].Surname, ind[age].Age); 

      Console.ReadKey(); 
     } 
    } 
} 

私がプログラムを実行し、最初の人のaddeを検索すると彼の年齢を入力することによって25: "ジョーソープ"にリスト<> dを入力すると、私は彼を正常に見つけることができ、彼のすべての情報を表示することができます。

しかし、すぐに、私はリストの誰を探して<は>あたり、さんは「ギャリーズマは」彼の年齢に入力して言わせて:37のメッセージが表示されたら、プログラムが失敗し、例外がスローされます。

をIndexer1.exeで 'System.NullReferenceException'型の未処理の例外が発生しました 追加情報:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

私はその例外で検索しようとしましたが、私の問題を解決したものは見つかりませんでした。

あなたのお手伝いをしていただきありがとうございます。

+4

は、デバッガでプログラムを実行し、通過防止

else { return null; } 

インデクサから、次のコードを削除する必要がありますあなたのプログラムが何をしているかを一歩一歩見てみましょう。 – chris

+1

これ以外にも、自動的に実装されたプロパティについて学ぶのは良いタイミングです。 –

+1

拡張するには、 'private int age; public int年齢 { get {return age; } set {age = value; } } '単純に' publicにすることができますint Age {get;プライベートセット;} '。うまくいけば、それについて学ぶためのインセンティブが与えられることを願っています。 – chris

答えて

3

あなたはこのコードは、ループがこれまでリスト内の最初の項目を過ぎてき

+0

私はこの答えでコードをフォーマットしました。次回のために適切に書式を設定してください。ありがとうございました –

2

繰り返し処理を見てみましょう。最初の反復で、if (item.Age == indexes)falseと評価された場合、メソッドはnullを呼び出しメソッド(Rest of iterations ware skipped)に返します。だからあなたがする必要があるのは、else{..}部分を削除することです。このメソッドは、条件を満たす場合はPersonオブジェクトを返します。そうでない場合は、反復処理後にnullを返します。

public Person this[int indexes] 
{ 
    get 
    { 
     bool isFound = false; 
     foreach (Person item in per) 
     { 
      if (item.Age == indexes) 
      { 
       return item; 
      }     
     } 
     return null; 
    } 
    set 
    { 
     per[indexes] = value; 
    } 
} 
関連する問題