First of all, you should try to match your arrays as graphs. Define the following class
private class Transition { public int ArrayNum { get; set; } public int? NextNum { get; set; } }
Given our arrays
var arrays = new[] { new[] {090, 010, 002, 007, 310, 104, 048, 610, 720}, new[] {456, 010, 002, 007, 087, 011, 345, 547, 800}, new[] {004, 089, 870, 011, 345, 547, 800, 001, 002} };
We will translate the transitions as follows:
var transitions = new Dictionary<int, List<Transition>>(); for (var i = 0; i < arrays.Length; i++) { for (var j = 0; j < arrays[i].Length; j++) { var num = arrays[i][j]; var transition = new Transition { ArrayNum = i, NextNum = j < arrays[i].Length - 1 ? arrays[i][j + 1] : (int?)null }; if (!transitions.ContainsKey(num)) { transitions.Add(num, new List<Transition> {transition}); } else { transitions[num].Add(transition); } } } transitions = transitions.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
After matching, we will go through each array only once, find the corresponding sequences:
private class Sequence { public int FirstArray { get; set; } public int SecondArray { get; set; } public IList<int> Nums { get; set; } } var sequences = new List<Sequence>(); for (var i = 0; i < arrays.Length-1; i++) { List<Sequence> relevantSequences = null; for (var j = 0; j < arrays[i].Length - 1; j++) { var num = arrays[i][j]; var nextNum = arrays[i][j+1]; var flows = transitions[num].Where(x => x.NextNum == nextNum && x.ArrayNum > i).ToList(); if (!flows.Any()) { if (relevantSequences != null) { sequences.AddRange(relevantSequences); relevantSequences = null; } } else { if (relevantSequences == null) { relevantSequences = flows.Select(x => new Sequence { FirstArray = i, SecondArray = x.ArrayNum, Nums = new List<int> {num, nextNum} }).ToList(); } else { foreach (var flow in flows) { var sequence = relevantSequences.SingleOrDefault(x => x.SecondArray == flow.ArrayNum); if (sequence != null) { sequence.Nums.Add(nextNum); } else { relevantSequences.Add(new Sequence { FirstArray = i, SecondArray = flow.ArrayNum, Nums = new List<int> { num, nextNum } }); } } } } } if (relevantSequences != null) sequences.AddRange(relevantSequences); }
Hope you find this helpful.