Вопрос создания коллекции / дизайн - PullRequest
1 голос
/ 29 августа 2011

Мне нужно привязать коллекцию к GridView в зависимости от типа отчета, выбранного пользователем.

Каждый отчет немного отличается, но использует один и тот же базовый набор результатов, который имеет много столбцов.Перед привязкой я хочу просмотреть цикл результатов и скопировать в более простую коллекцию (3 строковые переменные с именем 'column1', 'column2', 'column3').

Код:

namespace etc.etc.etc
{
    public class ReportEntity
    {
        public string column1 { get; set; }

        public string column2 { get; set; }

        public string column3 { get; set; }
    }
}

List<ReportEntity> a = new List<ReportEntity>();
ReportEntity[] b = new ReportEntity[results.Length];
for (int i = 0; i < results.Length; i++)
{
    //a[i].column1 = results[i].class.desc;
    //a[i].column2 = results[i].student.firstname;
    //a[i].column3 = results[i].timescanned.ToString();

    //b[i].column1 = results[i].class.desc;
    //b[i].column2 = results[i].student.firstname;
    //b[i].column3 = results[i].timescanned.ToString();
}

Раскомментирование, где я устанавливаю значения для a, дает Index was out of range. Must be non-negative and less than the size of the collection..Раскомментирование, где я устанавливаю значения для b, дает Object reference not set to an instance of an object..

results, безусловно, имеет много записей.Что я могу делать не так?

Ответы [ 2 ]

2 голосов
/ 29 августа 2011
  • Вы получаете IndexOutRangeException в первом случае, потому что вы только что создали экземпляр списка, но этот список не содержит никаких элементов.

  • Вы получите NullReferenceException во втором случае, потому что вы только что заполнили массив results.Length из nulls.

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

List<ReportEntity> a = new List<ReportEntity>();
ReportEntity[] b = new ReportEntity[results.Length];
for (int i = 0; i < results.Length; i++)
{
    a.Add(new ReportEntity() {column1 = results[i].class.desc,
                              column2 = results[i].student.firstname,
                              column3 =  results[i].student.firstname  }

    b[i] = new ReportEntity() {column1 = results[i].class.desc,
                              column2 = results[i].student.firstname,
                              column3 =  results[i].student.firstname  }
}

Или вы можете LINQ с Select методом расширения, чтобы он упоминался в другом ответе.

1 голос
/ 29 августа 2011

Чтобы добавить значение в список, используйте метод Add.

В качестве альтернативы, используйте выбор из LINQ:

var a = results.Select(r => new ReportEntity { 
  column1 = r.class.desc,
  column2 = r.student.firstname,
  column3 = r.timescanned.ToString()
}).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...