我需要根据用户选择的报告类型将集合绑定到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
绝对有很多记录。我能做错什么?
答案 0 :(得分:2)
在第一种情况下你得到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 }
}
或者你可以使用Select
扩展方法来LINQ,以便在另一个答案中提到它。
答案 1 :(得分:1)
要为List添加值,请使用Add
方法。
或者,使用从LINQ中选择:
var a = results.Select(r => new ReportEntity {
column1 = r.class.desc,
column2 = r.student.firstname,
column3 = r.timescanned.ToString()
}).ToList();