Information Technology Reference
In-Depth Information
var
data =
new
CSVDataContainer
(
new
System.IO.
StringReader
(myCSV));
foreach
(
var
item
in
data.Rows)
Console
.WriteLine(
"{0}, {1}, {2}"
,
item.Name, item.PhoneNumber, item.Label);
data = new
CSVDataContainer
(
new
System.IO.
StringReader
(myCSV2));
foreach
(
var
item
in
data.Rows)
Console
.WriteLine(
"{0}, {1}, {2}"
,
item.Date, item.high, item.low);
That's the API style I want for a general CSV reader class. The rows
returned from enumerating the data contain properties for every row
header name. Obviously, the row header names are not known at compile
time. Those properties must be dynamic. But nothing else in the
CSVDataContainer needs to be dynamic. The CSVDataContainer does
not support dynamic typing. However, the CSVDataContainer does con-
tain APIs that return a dynamic object that represents a row:
public class
CSVDataContainer
{
private class
CSVRow
:
DynamicObject
{
private
List
<
Tuple
<
string
,
string
>> values =
new
List
<
Tuple
<
string
,
string
>>();
public
CSVRow(
IEnumerable
<
string
> headers,
IEnumerable
<
string
> items)
{
values.AddRange(headers.Zip(items,
(header, value) =>
Tuple
.Create(header,
value)));
}
public override bool
TryGetMember(
GetMemberBinder
binder,
out object
result)
{
var
answer = values.FirstOrDefault(n =>
n.Item1 == binder.Name);
result = answer.Item2;