-1

削除機能で困っています。削除機能以外はすべて機能しています。

どんな助けでも大歓迎です。少し変更してみましたが、まだ削除されません。削除機能の問題が何であるかわかりません。

public class Person
{
    private string name;
    private string phoneNumber;

    public string Name
    {
        set { name = value; }
        get { return name; }
    }
    public string PhoneNumber
    {
        set { phoneNumber = value; }
        get { return phoneNumber; }
    }
    public void PrintInfo()
    {
        Console.WriteLine();
        Console.WriteLine(" Name: {0}", name);
        Console.WriteLine(" Phone Number: {0}", phoneNumber);
        Console.WriteLine();
    }
    public void SaveASCII(ref StreamWriter output)
    {

        output.WriteLine(name);
        output.WriteLine(phoneNumber);

    }
    public void LoadASCII(ref StreamReader input)
    {

        name = input.ReadLine();
        phoneNumber = input.ReadLine();

    }

}


public class membershipList
{

    public Person[] ML = null;

    public void AddMember(Person p)
    {
        if (ML == null)
        {
            ML = new Person[1];
            ML[0] = p;
        }
        else
        {
            Person[] temp = ML;
            ML = new Person[temp.Length + 1];
            for (int i = 0; i < temp.Length; ++i)
            {
                ML[i] = new Person();
                ML[i] = temp[i];
            }
            ML[temp.Length] = new Person();
            ML[temp.Length] = p;
            temp = null;

        }
    }
    public void DeleteMember(string p)
    {

        if (ML != null)
        {
            foreach (Person pers in ML)
            {
                if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
                {
                  pers.Remove();
                  break;

                }
            }
        }

        else Console.WriteLine("Then list is empty.");
    }


                //   {
                //      int memberIndex = Array.FindIndex(ML, p => p.Name == name);
                //      if (memberIndex == -1)
                //    {
                //        Console.WriteLine(name + " had not been added before.");
                //      return;
                //   }
               // else
               // {
                //    List<Person> tmp = new List<Person>(ML);
               //     tmp.RemoveAt(memberIndex);
               //     ML = tmp.ToArray();
               // }
       // }
  //  }


    public void PrintAll()
    {
        if (ML != null)
            foreach (Person pers in ML)
                pers.PrintInfo();
        else Console.WriteLine("Then list is empty");
    }
    public void Search(string p)
    {
        if (ML != null)
        {
            foreach (Person pers in ML)
            {
                if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
                {
                    Console.WriteLine("1 Record Found:");
                    pers.PrintInfo();
                    break;
                }
            }
        }

        else Console.WriteLine("Then list is empty.");
    }

    public void ReadASCIIFile()
    {
        StreamReader input = new StreamReader("memberlist.dat"); ;

        try
        {

            int num = Convert.ToInt32(input.ReadLine());
            ML = new Person[num];

            for (int i = 0; i < num; ++i)
            {
                ML[i] = new Person();
                ML[i].LoadASCII(ref input);

            }
            input.Close();
        }
        catch (FormatException e)
        {
            Console.WriteLine(e.Message);
            input.Close();
        }


    }

    public void SaveASCIIFile()
    {

        StreamWriter output = new StreamWriter("memberlist.dat");

        output.WriteLine(ML.Length);
        foreach (Person pers in ML)
        {
            pers.SaveASCII(ref output);

        }
        output.Close();


    }
}


class Program
{
    static void Main(string[] args)
    {

        membershipList ML = new membershipList();
        ML.ReadASCIIFile();

        string option;
        do
        {

            // Console.Clear();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("MemberShip List MENU");
            Console.WriteLine();
            Console.WriteLine("     a. Add");
            Console.WriteLine("     b. Seach");
            Console.WriteLine("     c. Delete");
            Console.WriteLine("     d. Print All");
            Console.WriteLine("     e. Exit");
            Console.WriteLine();
            Console.Write("option: ");
            option = Console.ReadLine().ToLower();

            switch (option)
            {
                case "a":
                    Person np = new Person();
                    Console.Write("Enter Name: ");
                    np.Name = Console.ReadLine();
                    Console.Write("Enter PhoneNumber: ");
                    np.PhoneNumber = Console.ReadLine();
                    ML.AddMember(np);
                    break;
                case "b":
                    Console.Write("Enter Name: ");
                    string name = Console.ReadLine();
                    ML.Search(name);
                    break;
                case "c":
                    Console.Write("Enter Name to be Deleted:");
                    string pers = Console.ReadLine();
                    ML.DeleteMember(pers);
                    break;
                case "d":
                    ML.PrintAll();

                    break;
                case "e":
                    ML.SaveASCIIFile();
                    Console.WriteLine("BYE...... ");
                    break;

                default:
                    Console.WriteLine("Invalid Option");
                    break;
            }


        } while (option.ToLower() != "d");
    }
}
4

3 に答える 3

0

配列をループしてから、人に対して remove を呼び出しています。for each ループに関する 1 つのことは、for each 中に変更できない反復子を使用することです。しかし、できたとしても、配列から単純に削除することはできないため、それほど単純ではありません。一般的な List または ListArray から実行できますが、配列からは実行できません。既に従っているのと同じパターンに従うには (配列を使用してサイズを変更する必要があると仮定して)、一時配列を作成し、削除されたメンバーを除いて M​​L 配列からすべての要素を新しい配列にコピーする必要があります。

このコードをテストしていないため、構文を確認してください。

public void DeleteMember(string p)
    {

        if (ML != null)
        {
            Person[] tempList = new Person[ML.Length - 1];
            bool deletedAPerson = false;
            int i = 0;
            foreach (Person pers in ML)
            {

                if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
                {
                   deletedAPerson = true;
                   continue; //skip over this person and do not copy over to the new Array
                }

                if(i < pers.Length) //if no person was found, prevent index out of bounds exception
                    tempList[i++] = pers;
            }
            if(deletedAPerson)
               ML = tempList;
        }

        else Console.WriteLine("Then list is empty.");
    }
于 2013-09-01T04:33:55.700 に答える
0

次の 2 つのことがわかります。

  1. リストに項目を追加および削除する場合List<Person>は、配列の代わりに a を使用します。現状では、配列を一時リストにコピーし、アイテムを削除してから、配列にコピーする必要があります。
  2. 関数Deleteは次のようになります。

    if (ML != null)
    {
        Person pers = ML.FirstOrDefault(x => x.Name.ToLower() == p.ToLower());
        if(pers != null)
        {
              ML.Remove(pers);
              break;
        }
    }
    
于 2013-09-01T03:34:20.627 に答える
0

あなたの問題はこれです:

foreach (Person pers in ML)
{
    if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
    {
        pers.Remove();
        break;
    }
}

繰り返し処理しているコレクションから削除しているため、ループの反復子がスローされます。

コレクションを逆方向にループするため、削除してもループの反復子がスローされません。

また

保持する値を保持する 2 番目のリストを作成します。したがって、本質的には反対のことをすることになります。削除する代わりに、保持リストに追加しません。

于 2013-09-01T03:37:18.437 に答える