поэтому я изменил свой код согласно комментарию @Joel Coehoorn. Мне удалось экспортировать 1 000 000 строк данных менее чем за минуту (по крайней мере, файл 230 МБ)
Код выглядит следующим образом:
var headers = dgvSearchFilter.Columns.Cast<DataGridViewColumn>();
string delimiter = ",";
DataTable dt = new DataTable();
foreach (DataGridViewColumn col in dgvSearchFilter.Columns)
{
dt.Columns.Add(new DataColumn(col.Name, typeof(string)));
}
foreach (DataGridViewRow row in dgvSearchFilter.Rows)
{
DataRow dataRow = dt.NewRow();
foreach (DataGridViewCell cell in row.Cells)
{
if (row.Cells[cell.ColumnIndex].Value == null || row.Cells[cell.ColumnIndex].Value == DBNull.Value || String.IsNullOrWhiteSpace(row.Cells[cell.ColumnIndex].Value.ToString()))
{
dataRow[cell.ColumnIndex] = " ";
}
else
{
dataRow[cell.ColumnIndex] = cell.Value.ToString();
}
}
dt.Rows.Add(dataRow);
}
string unique = DateTime.Now.ToString("yyyyMMddHHmmssffff");
string fileName = "SQLQueryOutput_" + unique + ".csv";
using (StreamWriter swr = new StreamWriter(File.Open(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileName), FileMode.CreateNew), Encoding.Default, 1000000))
{
swr.WriteLine(string.Join(",", headers.Select(column => "\"" + column.HeaderText + "\"").ToArray()));
foreach (DataRow dr in dt.Rows)
{
var line = dr.ItemArray.Select(r => r.ToString().Contains(delimiter) || r.ToString().Contains("\n") ? "\"" + r + "\"" : r);
swr.WriteLine(string.Join(delimiter, line));
}
}
MessageBox.Show("Your file was generated and its ready for use.");