Как сохранить контакты в адресной книге и перечислить их? - PullRequest
1 голос
/ 22 июля 2009

Я работаю над созданием адресной книги в C # 2008. Мне нужно иметь возможность сохранять контакты, а затем отображать их, когда пользователь попросил их. Мне также нужно обработать исключение, когда кто-то вводит неизвестный цвет при написании его любимого цвета. Это мой код:

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

namespace Lab02
{
    class Program
    {


        static void Main(string[] args)
        {
            Contact contact = new Contact();

            Console.WriteLine("Please enter the person's name:");
            contact.Name = Console.ReadLine();

            Console.WriteLine("Please enter the person's e-mail address:");
            contact.Email = Console.ReadLine();

            Console.WriteLine("Please enter the person's favorite color:");
            string tempColor = Console.ReadLine();
            contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
            try
            {

            }
            catch 
            {

            }
            finally
            {
                Console.WriteLine("This is an unknown color. Please enter a known color");
            } 
        }
        class Color
        {
            enum clr
            // This is a list of colors for the user to pick from.
            {
                Red,
                Green,
                Blue,
                Yellow,
                Purple,
                Brown,
                Black,
                Crimson,
                White,
                Turqoise,
                Orange,
                Cyan,
                Pink,
                Gold,
                Silver,
                Bronze,
                Gray,
                Indigo,
                Rust
            }
        }
    }
        class Contact
        {
            //This string represents the person's Name.
            public string Name { get; set; }

            //This string represents the person's Email.
            public string Email { get; set; }

            public System.Drawing.KnownColor Favoritecolor 
            {
                get;
                set;
            }
        }
    }

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 5 ]

1 голос
/ 22 июля 2009

собираетесь ли вы отображать их в консольном приложении Form App, нужно ли ему сохранять данные или просто хранить в памяти на протяжении всего жизненного цикла приложения, ваш класс «Контакт» сериализуем

Для простоты и поскольку это домашнее задание, сделайте ваш класс Contact Serializable

[Serializable]
public class Contact
{}

и использовать двоичную сериализацию, я не собираюсь все это здесь писать, но достаточно просто найти двоичную сериализацию и двоичные форматы, которые могут записывать поток на диск для каждого контакта или список контактов, если хотите. затем, если это в консольном приложении, создайте строку readline, которая принимает команду «Список» и выполняет метод, который выполняет их итерацию и отображает свойства для каждого контакта.

Насколько я пойду писать домашнее задание, если вы мне не заплатите

1 голос
/ 22 июля 2009

Вы также можете использовать Reflection:

    public static class ColorInfo
    {
        private static readonly PropertyInfo[] PropertiesInfo;

        static ColorInfo()
        {
            PropertiesInfo = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static);
        }

        public static bool TryGetKnownColorFromString(string colorName, out KnownColor knowColor)
        {
            if (String.IsNullOrEmpty(colorName))//if wrong color name
            {
                knowColor = KnownColor.ActiveBorder;
                return false;
            }
            try
            {
                foreach (PropertyInfo property in PropertiesInfo)
                {
                    if (property.Name.Equals(colorName, StringComparison.InvariantCultureIgnoreCase))
                    {
                        knowColor = ((Color)property.GetValue(null, null)).ToKnownColor();
                        return true;
                    }
                }
            }
            catch (Exception exc)
            {
                //catch GetValue & Equals methods exceptions
                if (!(exc is ArgumentException || exc is TargetException ||
                    exc is TargetParameterCountException ||
                    exc is MethodAccessException ||
                    exc is TargetInvocationException))
                {
                    //throw exc; //We don't want to lose information from StackTrace
                    throw; 
                }
            }
            knowColor = KnownColor.ActiveBorder;
            return false;
        }
    }

Просто тест:

        string[] colors = { "reD", "AzUre", "Blue", "BlueViollet" };
        KnownColor knowColor;
        foreach (String color in colors)
        {
            if (ColorInfo.TryGetKnownColorFromString(color, out knowColor))
            {
                Console.WriteLine(knowColor.ToString());
            }
            else
            {
                Console.WriteLine("Color: {0} - not found !", color);
            }
        }

Выход:

Red
Azure
Blue
Color: BlueViollet - not found !

Полезное использование:

using System;
using System.Drawing;
using System.Reflection;
1 голос
/ 22 июля 2009

Почему бы не перечислить все цвета, которые пользователь может выбрать, с помощью значения Enum, затем попросить их ввести число, попробовать преобразовать его в перечисление и сохранить его. Если преобразование не удалось, сообщите им, что оно недействительно.

Вот небольшой фрагмент, чтобы помочь. Однако вам нужно будет опубликовать свой список.

Console.WriteLine("Here are a list of colors:");

foreach(Color.clr item in Enum.GetValues(typeof(Color.clr)))
{
    Console.WriteLine(string.Format("{0} - {1}",(int)item,item.ToString()));
}
Console.WriteLine("Please choose your color");
string colorInput = Console.ReadLine();
int colorValue = 0;
if(!int.TryParse(colorInput, out colorValue))
{
        Console.WriteLine(string.Format("{0} is not a valid number",colorInput));
        return;
}

// This will give an error if they've typed a number that wasn't listed
// So need to add a bit of checking here
Color.clr tempColor = (Color.clr)colorValue;

// Your code here
0 голосов
/ 22 июля 2009

Хорошо, вот эта строка:

   contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));

Где вы берете значение цвета, введенное пользователем, и преобразуете его в известный цвет, верно?

Похоже, именно здесь вы можете столкнуться с проблемами. Я бы посмотрел, какой тип исключений может быть выдан этой строкой, и правильно обработал бы их.

Что произойдет, если кто-то введет «красный» в командной строке? Должно ли это быть исключением? В вашем примере кода это будет исключение?

Кроме того, у вас есть собственный цветовой класс с типом перечисления, называемым "clr", но в вашем коде вы анализируете перечисление для типа System.Drawing.KnownColor. Я бы исключил пользовательский класс и использовал бы встроенный тип.

0 голосов
/ 22 июля 2009

Синтаксический анализ перемещается в блок try, блок catch (который перехватывает исключение) сообщает пользователю, что ему нужно ввести что-то известное. Блок finally не требуется, поэтому он был удален:

try
{
    contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
}
catch(ArgumentException)
{
    Console.WriteLine("This is an unknown color. Please enter a known color");
}

Следующая часть заключается в том, что вам нужен цикл до тех пор, пока не будет введен правильный цвет

bool isValidColour = false;
while (!isValidColour)
{
    Console.WriteLine("Please enter the person's favorite color:");
    string tempColor = Console.ReadLine();
    try
    {
        contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
    isValidColour = true;
    }
    catch(ArgumentException)
    {
        Console.WriteLine("This is an unknown color. Please enter a known color");
    }
}

Выше будет повторяться, пока не будет введен правильный цвет.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...