我需要一种方法,从星期一到星期五打印一个月内的所有星期,然后在数据网格视图中打印与每个工作日相对应的行。
我有一个完整的解决方案,但效率不高,因为我必须逐个查看每一行,看看它是否匹配,一个月中的每个工作日:
for (int i=diaInicio;i<=diaFinal;i++)
{
fecha = i.ToString().PadLeft(2, '0') + "-" + fechaInicio.Month.ToString().PadLeft(2, '0')
+ "-" + fechaInicio.Year.ToString();
fechaCiclo = new DateTime(fechaInicio.Year, fechaInicio.Month, i);
foreach (DataGridViewRow row in dgActividades.Rows)
{
if (row.Cells[0].Value.ToString().Equals(fecha))
{
//suppose this actually prints the row's cells
printRowCells();
}
else if (Convert.ToInt32(row.Cells[0].Value.ToString().Substring(0, 2)) > i)
{
//break when the grid date is newer that what i want
break;
}
}
}
所以这样做,就是从第一行迭代到第一行读取第一行然后断开,然后从11月9日到第13行调用等等......如你所见,我有在外面读取每天最多31天,大约20次......几乎是O(N)^ 2
是否有一些索引或地图方法可以将我自己定位在我需要的第一行,然后像我正在做的那样打破或者会不会有太多麻烦?
编辑:它有点hackish,但是如果我添加一个全局变量来存储从0开始的DataGridView索引的当前位置,我可以有效地迭代所有这一次:int indiceFila = 0;
for (int i=diaInicio;i<=diaFinal;i++)
{
fecha = i.ToString().PadLeft(2, '0') + "-" + fechaInicio.Month.ToString().PadLeft(2, '0')
+ "-" + fechaInicio.Year.ToString();
while(indiceFila<dgActividades.Rows.Count-1)
{
DataGridViewRow row = dgActividades.Rows[indiceFila];
if (row.Cells[0].Value.ToString().Equals(fecha))
{
printValues();
}
else if (Convert.ToInt32(row.Cells[0].Value.ToString().Substring(0, 2)) > i)
{
break;
}
indiceFila++;
}
}
当然,这仅在第一列按升序日期
排序时有效