Вместо этого я хочу лениво генерировать объекты DataRow только тогда, когда они действительно нужны. Моя цель — реализовать метод, который возвращает IEnumerable и использует возврат доходности, чтобы строки передавались из файла и потреблялись на лету с помощью цикла foreach.
Вот чего я пытаюсь достичь:
Чтение файла построчно, без буферизации всего файла.
Преобразуйте каждую строку в DataRow на основе предопределенного столбца.
Используйте возврат доходности для ленивого возврата каждой строки.
Начинайте читать и генерировать строки только тогда, когда цикл foreach начинает потреблять данные.
Совместим ли этот подход с DataTable или мне следует рассмотреть альтернативную структуру, которая лучше поддерживает отложенное создание строк?
Например, в приведенном ниже коде, когда я хочу просматривая данные с помощью оператора foreach, я хочу, чтобы данные загружались из внешнего источника, например файла.
Код: Выделить всё
public static void Main()
{
var datatable = ConvertExcelToDataTable();
//I Want Load Rows From File Now
foreach (var item in datatable.Rows)
{
}
}
public static DataTable ConvertExcelToDataTable()
{
var datatable = new DataTable();
datatable.Columns.Add("Id");
datatable.Columns.Add("Name");
//The following line has an error because datatable.rows is read-only.
datatable.Rows = GetRowsFromExcel(datatable);
return datatable;
}
static IEnumerable GetRowsFromExcel(DataTable datatable)
{
string filePath = "data.csv";
using (var reader = new StreamReader(filePath))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
var row = datatable.NewRow();
row["Id"] = values[0];
row["Name"] = values[1];
yield return row;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... able-and-y
Мобильная версия