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); + } + } }