Используя функцию Linq Take
, вы можете заменить следующий блок кода из вашего первого примера:
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
sb.Append("</td></tr>");
}
с этим:
foreach (var row in dt.Rows.OfType<DataRow>().Take(3))
{
sb.Append("<tr><td>");
sb.Append(row["EMail"].ToString());
sb.Append("</td></tr>");
}
Так как Take возвращает до указанного числа элементов в начале последовательности, этот блок кода будет выполняться от 0 до 3 раз. У вас будет отображаться максимум 3 адреса (даже если их будет больше), и вы не получите IndexOutOfRangeException
, если у вас меньше 3.
ОБНОВЛЕНИЕ: совместимо с ASP.NET 2.0
Поскольку вы не можете использовать Linq, результат должен быть таким же:
for (int i = 0; i < (dt.Rows.Count > 3 ? 3 : dt.Rows.Count); i++)
{
sb.Append("<tr><td>");
sb.Append(dt.Rows[i]["EMail"].ToString());
sb.Append("</td></tr>");
}
Выражение dt.Rows.Count > 3 ? 3 : dt.Rows.Count
использует оператор ?
, чтобы заставить цикл for
выполнять итерацию по всем адресам электронной почты, если их больше 3, в этом случае он будет повторяться только 3 раз.