收藏创作/设计问题

时间:2011-08-29 09:49:41

标签: c# collections

我需要根据用户选择的报告类型将集合绑定到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 个答案:

答案 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();