diff --git a/src/CsvHelper/Configuration/ClassMap`1.cs b/src/CsvHelper/Configuration/ClassMap`1.cs
index 97b3cabc9..aa5d65d6c 100644
--- a/src/CsvHelper/Configuration/ClassMap`1.cs
+++ b/src/CsvHelper/Configuration/ClassMap`1.cs
@@ -27,7 +27,7 @@ public ClassMap() : base(typeof(TClass)) { }
/// The member mapping.
public virtual MemberMap Map(Expression> expression, bool useExistingMap = true)
{
- var (classMap, member) = GetMemberMap(expression);
+ var classMap = GetMemberMap(expression, out var member);
var memberMap = classMap.Map(typeof(TClass), member, useExistingMap); ;
return (MemberMap)memberMap;
@@ -42,7 +42,7 @@ public virtual MemberMap Map(ExpressionThe member mapping.
public virtual MemberMap Map(Expression> expression, bool useExistingMap = true)
{
- var (classMap, member) = GetMemberMap(expression);
+ var classMap = GetMemberMap(expression, out var member);
var memberMap = classMap.Map(typeof(TClass), member, useExistingMap);
return memberMap;
@@ -64,7 +64,7 @@ public virtual MemberReferenceMap References(Expression(Expression> expression)
+ private ClassMap GetMemberMap(Expression> expression, out MemberInfo member)
{
var stack = ReflectionHelper.GetMembers(expression);
if (stack.Count == 0)
@@ -73,7 +73,6 @@ public virtual MemberReferenceMap References(Expression 1)
{
@@ -105,6 +104,6 @@ public virtual MemberReferenceMap References(Expression recordManager;
private readonly bool detectColumnCountChanges;
private readonly Dictionary> namedIndexes = new Dictionary>();
- private readonly Dictionary namedIndexCache = new Dictionary();
+ private readonly Dictionary namedIndexCache = new Dictionary();
private readonly Dictionary typeConverterOptionsCache = new Dictionary();
private readonly MemberMapData reusableMemberMapData = new MemberMapData(null);
private readonly bool hasHeaderRecord;
@@ -1276,8 +1276,7 @@ public virtual int GetFieldIndex(IEnumerable names, int index = 0, bool
var nameKey = string.Join("_", names) + index;
if (namedIndexCache.TryGetValue(nameKey, out var cache))
{
- (var cachedName, var cachedIndex) = cache;
- return namedIndexes[cachedName][cachedIndex];
+ return namedIndexes[cache.Name][cache.Index];
}
// Check all possible names for this field.
@@ -1310,7 +1309,7 @@ public virtual int GetFieldIndex(IEnumerable names, int index = 0, bool
return -1;
}
- namedIndexCache.Add(nameKey, (name, index));
+ namedIndexCache.Add(nameKey, new NameIndex(name, index));
return namedIndexes[name][index];
}
@@ -1435,4 +1434,31 @@ protected virtual void ParseNamedIndexes()
}
}
}
+
+ private readonly struct NameIndex : IEquatable
+ {
+ public string Name { get; }
+ public int Index { get; }
+
+ public NameIndex(string name, int index)
+ {
+ Name = name;
+ Index = index;
+ }
+
+ public override bool Equals(object? obj)
+ {
+ return obj is NameIndex index && Equals(index);
+ }
+
+ public bool Equals(NameIndex other)
+ {
+ return Name == other.Name && Index == other.Index;
+ }
+
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Name, Index);
+ }
+ }
}