首先,你应该尝试将数组映射为图形。
我们将定义以下类。
private class Transition
{
public int ArrayNum { get; set; }
public int? NextNum { get; set; }
}
假设我们有以下数组
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}
};
我们将按照以下方式映射转换:
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);
在完成映射后,我们将只遍历每个数组一次,找到它们相关的序列:
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);
}
希望你会觉得它有用。