{"record":{"id":"cb7e3350658475c3","repo":"dotnet/machinelearning","slug":"array-lengths-are-mistmached","errorCode":null,"errorMessage":"Array lengths are mistmached","messagePattern":"Array lengths are mistmached","errorType":"validation","errorClass":"System.ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.Data.Analysis/DataFrame.Join.cs","lineNumber":183,"sourceCode":"        /// <returns></returns> \n        public DataFrame Merge<TKey>(DataFrame other, string leftJoinColumn, string rightJoinColumn, string leftSuffix = \"_left\", string rightSuffix = \"_right\", JoinAlgorithm joinAlgorithm = JoinAlgorithm.Left)\n        {\n            return Merge(other, new[] { leftJoinColumn }, new[] { rightJoinColumn }, leftSuffix, rightSuffix, joinAlgorithm);\n        }\n\n        private static HashSet<long> Merge(DataFrame retainedDataFrame, DataFrame supplementaryDataFrame,\n            string[] retainedJoinColumnNames, string[] supplemetaryJoinColumnNames,\n            out PrimitiveDataFrameColumn<long> retainedRowIndices, out PrimitiveDataFrameColumn<long> supplementaryRowIndices,\n            bool isInner = false, bool calculateIntersection = false)\n        {\n            if (retainedJoinColumnNames == null)\n                throw new ArgumentNullException(nameof(retainedJoinColumnNames));\n\n            if (supplemetaryJoinColumnNames == null)\n                throw new ArgumentNullException(nameof(supplemetaryJoinColumnNames));\n\n            if (retainedJoinColumnNames.Length != supplemetaryJoinColumnNames.Length)\n                throw new ArgumentException(Strings.MismatchedArrayLengths, nameof(retainedJoinColumnNames));\n\n            Dictionary<long, ICollection<long>> occurrences = GetOccurences(retainedDataFrame, supplementaryDataFrame,\n                retainedJoinColumnNames, supplemetaryJoinColumnNames, out HashSet<long> supplementaryJoinColumnsNullIndices);\n\n            return PerformMerging(retainedDataFrame, retainedJoinColumnNames, occurrences, supplementaryJoinColumnsNullIndices,\n                out retainedRowIndices, out supplementaryRowIndices, isInner, calculateIntersection);\n        }\n\n        private static Dictionary<long, ICollection<long>> GetOccurences(DataFrame retainedDataFrame, DataFrame supplementaryDataFrame,\n            string[] retainedJoinColumnNames, string[] supplemetaryJoinColumnNames, out HashSet<long> supplementaryJoinColumnsNullIndices)\n        {\n            supplementaryJoinColumnsNullIndices = new HashSet<long>();\n\n            // Get occurrences of values in columns used for join in the retained and supplementary dataframes\n\n            Dictionary<long, ICollection<long>> occurrences = null;\n            Dictionary<long, long> retainedIndicesReverseMapping = null;\n","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.Data.Analysis/DataFrame.Join.cs#L165-L201","documentation":"Merge requires the retained and supplementary join-key arrays to have the same number of entries — one join column per side per key. When lengths differ it throws ArgumentException(Strings.MismatchedArrayLengths, nameof(retainedJoinColumnNames)); note the resource string reads 'Array lengths are mistmached' (typo included).","triggerScenarios":"Calling Merge with retainedJoinColumnNames.Length != supplemetaryJoinColumnNames.Length, e.g. df.Merge(other, new[]{\"Id\"}, new[]{\"Id\",\"TenantId\"}).","commonSituations":"Joining composite keys where one side lists fewer columns; building the key arrays from different config sources that drifted; renaming a column on one side so it was dropped from one array.","solutions":["Make both arrays the same length, pairing columns positionally for each join key","Include every composite-key column on both sides","Validate lengths and contents exist in each DataFrame before merging","Catch ArgumentException and report which join specification was mismatched"],"exampleFix":"// before\ndf.Merge(other, new[] { \"Id\" }, new[] { \"Id\", \"TenantId\" });\n// after\ndf.Merge(other, new[] { \"Id\", \"TenantId\" }, new[] { \"Id\", \"TenantId\" });","handlingStrategy":"validation","validationCode":"if (leftKeys == null || rightKeys == null || leftKeys.Length != rightKeys.Length)\n    throw new InvalidOperationException(\"Join key arrays must have equal length\");","typeGuard":null,"tryCatchPattern":"try { return df.Merge(other, leftKeys, rightKeys); } catch (ArgumentException ex) when (ex.Message.Contains(\"mistmached\")) { throw new InvalidOperationException(\"Composite join keys must be paired on both sides\", ex); }","preventionTips":["Build both key arrays from a single shared definition","Verify each key column exists in both DataFrames","Write a small wrapper around Merge that validates pairing before delegating"],"tags":["argument","join","array-length"],"backgroundTag":"invalid-argument-value","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}