public static void WriteCsv
        (
            this DataView dataView,
            TextWriter writer,
            string fieldSeparator,
            string recordSeparator,
            IEnumerable <string> columnsToWrite = null
        )
        {
            dataView.ThrowIfNull("dataView");
            writer.ThrowIfNull("writer");
            fieldSeparator.ThrowIfNull("fieldSeparator");
            recordSeparator.ThrowIfNull("recordSeparator");

            if (columnsToWrite == null || columnsToWrite.Count() == 0)
            {
                columnsToWrite = dataView.ColumnNames();
            }
            else
            {
                var unknownColumns = columnsToWrite.Except(dataView.ColumnNames(), StringComparer.OrdinalIgnoreCase);
                if (unknownColumns.Count() > 0)
                {
                    throw new ArgumentException("There are unknonwn columns.");
                }
            }

            // Write column headings.
            foreach (string column in columnsToWrite)
            {
                writer.Write(column);
                writer.Write(fieldSeparator);
            }
            writer.Write(recordSeparator);

            // Write data.
            foreach (DataRowView row in dataView)
            {
                bool first = true;
                foreach (string columnName in columnsToWrite)
                {
                    var column = row[columnName];
                    if (!first)
                    {
                        writer.Write(fieldSeparator);
                    }
                    writer.Write(column.ToString());
                    first = false;
                }

                writer.Write(recordSeparator);
            }
        }