我有一个列表,如果它包含序列中的所有数字,我需要对它进行排序:
手动设置它们似乎不是解决问题的方法。
我知道如何命令列表升序或降序但是模数4让我的头很有趣。
4的模数是由于它与网格上的节点邻居链接
我不知道它们最初放入列表的顺序是什么,因为它是随机的并且每次都在变化 - 程序生成网格连接
我不想要新的清单,我只是想简单地重新排列当前的清单。
列表计数3:
0,1,2
1,2,3
2,3,0
3,0,1
if (acceptedIndicies.Contains(0) && acceptedIndicies.Contains(1) && acceptedIndicies.Contains(2)) // Top-Right-Down
{
// Order List in the sequence
acceptedIndicies[0] = 0;
acceptedIndicies[1] = 1;
acceptedIndicies[2] = 2;
}
else if (acceptedIndicies.Contains(1) && acceptedIndicies.Contains(2) && acceptedIndicies.Contains(3)) // Right-Down-Left
{
// Order List in the sequence
acceptedIndicies[0] = 1;
acceptedIndicies[1] = 2;
acceptedIndicies[2] = 3;
}
else if (acceptedIndicies.Contains(2) && acceptedIndicies.Contains(3) && acceptedIndicies.Contains(0)) // Down-Left-Top
{
// Order List in the sequence
acceptedIndicies[0] = 2;
acceptedIndicies[1] = 3;
acceptedIndicies[2] = 0;
}
else if (acceptedIndicies.Contains(3) && acceptedIndicies.Contains(0) && acceptedIndicies.Contains(1)) // Left-Top-Right
{
// Order List in the sequence
acceptedIndicies[0] = 3;
acceptedIndicies[1] = 0;
acceptedIndicies[2] = 1;
}
列表计数2:
0,1
1,2
2,3
3,0
if (acceptedIndicies.Contains(0) && acceptedIndicies.Contains(1))
{
// Order List in the sequence
acceptedIndicies[0] = 0;
acceptedIndicies[1] = 1;
}
else if (acceptedIndicies.Contains(1) && acceptedIndicies.Contains(2))
{
// Order List in the sequence
acceptedIndicies[0] = 1;
acceptedIndicies[1] = 2;
}
else if (acceptedIndicies.Contains(2) && acceptedIndicies.Contains(3))
{
// Order List in the sequence
acceptedIndicies[0] = 2;
acceptedIndicies[1] = 3;
}
else if (acceptedIndicies.Contains(3) && acceptedIndicies.Contains(0))
{
// Order List in the sequence
acceptedIndicies[0] = 3;
acceptedIndicies[1] = 0;
}
答案 0 :(得分:1)
您可以执行以下操作:
构建有效的模数序列。这很简单:
var modulusSequence = Enumerable.Range(0, modulus);
现在您需要一种生成给定模数和长度的所有有效模数序列的方法。这也很简单,只需向左或向右移动modulus
次我们碰巧知道的每个新移位序列的第一个 n 元素的有效序列:
private static IEnumerable<int> ShiftLeft(IEnumerable<int> sequence)
{
if (!sequence.Any())
yield break;
foreach (var i in sequence.Skip(1))
{
yield return i;
}
yield return sequence.First();
}
private static IEnumerable<IEnumerable<int>> getAllModulusSequences(int modulus, int length)
{
var sequence = Enumerable.Range(0, modulus);
for (var i = 0; i < modulus; i++)
{
yield return sequence.Take(length);
sequence = ShiftLeft(sequence);
}
}
现在你只需要检查给定的序列是否包含有效序列的所有元素(请注意,这样做是不正确的,因为如果给定序列有重复项,你可能会得到误报)。如果是,则返回有效序列。
我注意到我没有订购你的清单,如果序列无效,我会返回一个新的或null
。
public static IList<int> GetOrderedSequence(IList<int> sequence, int modulus)
{
if (modulus < sequence.Count)
throw new ArgumentOutOfRangeException(nameof(sequence), "Sequence can not contain more elements than specified modulus.");
foreach (var validSequence in getAllModulusSequences(modulus, sequence.Count))
{
if (validSequence.All(item => sequence.Contains(item)))
return validSequence.ToList();
}
return null;
}
这比你的方法更快/更有效吗?可能不是。它更漂亮吗?我是这么认为的,但它有争议。它更灵活吗?哦,是的!
如果您完全确定只需要检查2
和3
长模数4
的序列,那么您可以保留代码。如果没有,请实施一个通用解决方案,就像我向您展示的那样。