收集制作/设计问题

本文关键字:问题 | 更新日期: 2023-09-27 18:06:50

我需要根据用户选择的报告类型将集合绑定到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肯定有很多记录。我能做错什么吗?

收集制作/设计问题

  • 在第一种情况下你得到IndexOutRangeException,因为你刚刚创建了一个list的实例,但这个list不包含任何元素。

  • 在第二种情况下你得到NullReferenceException,因为你刚刚用nullsresults.Length填充了数组。

您应该做的是显式地创建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  }
}

或者您可以使用Select扩展方法LINQ,就像在另一个答案中提到的那样。

使用Add方法为List添加值

或者使用select from LINQ:

var a = results.Select(r => new ReportEntity { 
  column1 = r.class.desc,
  column2 = r.student.firstname,
  column3 = r.timescanned.ToString()
}).ToList();