Хранение данных в списке с классом - PullRequest
49 голосов
/ 06 декабря 2011

У меня есть следующий класс:

public class EmailData
{
    public string FirstName{ set; get; }
    public string LastName { set; get; }
    public string Location{ set; get; }
}

Затем я сделал следующее, но не работал должным образом:

List<EmailData> lstemail = new List<EmailData>(); 
lstemail.Add("JOhn","Smith","Los Angeles");

Я получаю сообщение о том, что перегрузка метода не требует 3 аргументов.

Ответы [ 13 ]

81 голосов
/ 06 декабря 2011

Вам необходимо добавить экземпляр класса:

lstemail.Add(new EmailData { FirstName = "John", LastName = "Smith", Location = "Los Angeles"});

Я бы порекомендовал добавить конструктор в ваш класс, однако:

public class EmailData
{
    public EmailData(string firstName, string lastName, string location)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Location = location;
    }
    public string FirstName{ set; get; }
    public string LastName { set; get; }
    public string Location{ set; get; }
}

Это позволит вам написать дополнение к вашему списку, используя конструктор:

lstemail.Add(new EmailData("John", "Smith", "Los Angeles"));
73 голосов
/ 06 декабря 2011

Если вы хотите создать экземпляр и добавить одну и ту же строку, вам нужно сделать что-то вроде этого:

lstemail.Add(new EmailData { FirstName = "JOhn", LastName = "Smith", Location = "Los Angeles" });

или просто создайте экземпляр объекта ранее и добавьте его непосредственно в:

EmailData data = new EmailData();
data.FirstName = "JOhn";
data.LastName = "Smith";
data.Location = "Los Angeles"

lstemail.Add(data);
29 голосов
/ 06 декабря 2011

Вам необходимо создать новый экземпляр EmailData, а затем добавить:

var data = new EmailData { FirstName = "John", LastName = "Smith", Location = "LA" };

List<EmailData> listemail = new List<EmailData>();
listemail.Add(data);

Если вы хотите сделать:

listemail.Add("JOhn","Smith","Los Angeles");

Вы можете создать свой собственный список, специализируя System.Collections.Generic.List и реализуя собственный метод Add, более или менее подобный этому:

public class EmailList : List<EmailData>
{
    public void Add(string firstName, string lastName, string location)
    {
        var data = new EmailData 
                   { 
                       FirstName = firstName, 
                       LastName = lastName,
                       Location = location
                   };
        this.Add(data);
    }
}
14 голосов
/ 06 декабря 2011

Один способ (в одну строку) сделать это так:

listemail.Add(new EmailData {FirstName = "John", LastName = "Smith", Location = "Los Angeles"});
13 голосов
/ 06 декабря 2011

Вам необходимо создать экземпляр класса для добавления:

lstemail.Add(new EmailData
                 {
                     FirstName = "JOhn",
                     LastName = "Smith",
                     Location = "Los Angeles"
                 });

См. Как: инициализировать объекты с помощью инициализатора объектов (Руководство по программированию в C #)


В качестве альтернативы вы можете объявить конструктор для вас EmailData объекта и использовать его для создания экземпляра.

8 голосов
/ 06 декабря 2011

Вы пытаетесь позвонить

List.Add(string,string,string)
. Попробуйте это:
lstemail.add(new EmailData{ FirstName="John", LastName="Smith", Location="Los Angeles"});
8 голосов
/ 06 декабря 2011

Вы не добавляете новый экземпляр класса в список.Попробуйте это:

lstemail.Add(new EmailData { FirstName="John", LastName="Smith", Location="Los Angeles" });`

List - универсальный класс.Когда вы указываете List<EmailData>, метод Add ожидает объект типа EmailData.Пример выше, выраженный в более подробном синтаксисе, будет выглядеть так:

EmailData data = new EmailData();
data.FirstName="John";
data.LastName="Smith;
data.Location = "Los Angeles";
lstemail.Add(data);
6 голосов
/ 09 декабря 2011

Вот версия метода расширения:

public static class ListOfEmailDataExtension
{
    public static void Add(this List<EmailData> list, 
        string firstName, string lastName, string location)
    {
        if (null == list)
            throw new NullReferenceException();

        var emailData = new EmailData
                            {
                                FirstName = firstName, 
                                LastName = lastName, 
                                Location = location
                            };
        list.Add(emailData);
    }
}

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

List<EmailData> myList = new List<EmailData>();
myList.Add("Ron", "Klein", "Israel");
6 голосов
/ 06 декабря 2011

Эта строка является вашей проблемой:

lstemail.Add("JOhn","Smith","Los Angeles");

Нет прямого приведения из 3 строк в ваш пользовательский класс.Компилятор не может понять, что вы пытаетесь сделать с этой строкой.Вам нужно Add() экземпляр класса lstemail:

lstemail.Add(new EmailData { FirstName = "JOhn", LastName = "Smith", Location = "Los Angeles" });
6 голосов
/ 06 декабря 2011

Как вы ожидаете, List<EmailData>.Add узнает, как превратить три string с в экземпляр EmailData? Вы ожидаете слишком многого от Framework. Нет перегрузки List<T>.Add, которая принимает три строковых параметра. Фактически, единственная перегрузка List<T>.Add принимает T. Следовательно, вы должны создать экземпляр EmailData и передать его в List<T>.Add. Вот что делает приведенный выше код.

Попробуйте:

lstemail.Add(new EmailData {
    FirstName = "JOhn", 
    LastName = "Smith",
    Location = "Los Angeles"
});

Используется синтаксис инициализации объекта C #. Кроме того, вы можете добавить конструктор в ваш класс

public EmailData(string firstName, string lastName, string location) {
    this.FirstName = firstName;
    this.LastName = lastName;
    this.Location = location;
}

Тогда:

lstemail.Add(new EmailData("JOhn", "Smith", "Los Angeles"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...