Skip to content

Commit 8cc0a3a

Browse files
author
electricessence
committed
Implemented additional case-insensitive mapping.
1 parent 8c4f8cf commit 8cc0a3a

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

Extensions.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public static (string Name, int Ordinal)[] GetOrdinalMapping(this IDataRecord re
164164
try
165165
{
166166
var q = cn
167-
.Select(n => (Name: n, Ordinal: record.GetOrdinal(n)));
167+
.Select(n => (Name: n, Ordinal: record.GetOrdinal(n))); // Does do a case-insensitive search after a case-sensitive one.
168168

169169
if (sort)
170170
q = q.OrderBy(m => m.Ordinal);
@@ -210,15 +210,31 @@ public static object[] GetValuesFromOrdinals(this IDataRecord record, params int
210210
public static (string Name, int Ordinal)[] GetMatchingOrdinals(this IDataRecord record, IEnumerable<string> columnNames, bool sort = false)
211211
{
212212
if (columnNames == null) throw new ArgumentNullException(nameof(columnNames));
213+
214+
// Normalize the requested column names to be lowercase.
215+
columnNames = columnNames.Select(c =>
216+
{
217+
if(string.IsNullOrWhiteSpace(c))
218+
throw new ArgumentException("Column names cannot be null or whitespace only.");
219+
return c.ToLowerInvariant();
220+
});
221+
213222
var actual = record.GetOrdinalMapping();
214223
if (sort)
215224
{
216-
var requested = columnNames as HashSet<string> ?? new HashSet<string>(columnNames);
217-
return actual.Where(m => requested.Contains(m.Name)).ToArray();
225+
var requested = new HashSet<string>(columnNames);
226+
// Return actual values based upon if their lower-case counterparts exist in the requested.
227+
return actual
228+
.Where(m => columnNames.Contains(m.Name.ToLowerInvariant()))
229+
.ToArray();
218230
} else
219231
{
220-
var actualColumns = actual.ToDictionary(m => m.Name, m => m);
221-
return columnNames.Where(c => actualColumns.ContainsKey(c)).Select(c => actualColumns[c]).ToArray();
232+
// Create a map of lower-case keys to acutal.
233+
var actualColumns = actual.ToDictionary(m => m.Name.ToLowerInvariant(), m => m);
234+
return columnNames
235+
.Where(c => actualColumns.ContainsKey(c)) // Select lower case column names if they exist in the dictionary.
236+
.Select(c => actualColumns[c]) // Then select the actual values based upon that key.
237+
.ToArray();
222238
}
223239
}
224240

Transformer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public Transformer(IEnumerable<(string Field, string Column)> overrides = null)
3838
}
3939
}
4040

41-
ColumnToPropertyMap = PropertyMap.ToDictionary(kvp => kvp.Value, kvp => pm[kvp.Key]);
41+
ColumnToPropertyMap = PropertyMap.ToDictionary(kvp => kvp.Value.ToLowerInvariant(), kvp => pm[kvp.Key]);
4242

4343
}
4444

@@ -81,7 +81,7 @@ public void SetNames(string[] names)
8181
var map = Transformer.ColumnToPropertyMap;
8282
_names = names;
8383
_properties = names
84-
.Select(n => map.TryGetValue(n, out PropertyInfo p) ? p : null)
84+
.Select(n => map.TryGetValue(n.ToLowerInvariant(), out PropertyInfo p) ? p : null)
8585
.ToArray();
8686
}
8787

0 commit comments

Comments
 (0)