Order List对模数4计数2和3

本文关键字:计数 List Order | 更新日期: 2023-09-27 18:07:24

我有一个列表,我需要按顺序排序,前提是它包含所有的数字在其序列中:

手动设置它们似乎不是解决问题的方法。

我知道如何将列表排序为升序或降序,但模数为4让我的头很滑稽。

4的模量是由于它被链接到网格上的节点邻居

我不知道它们最初被放入列表的顺序,因为它是随机的,每次都在变化-网格连接的程序生成

我不想要一个新的列表,我只想简单地重新排列当前的列表。

List Count of 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;
}

List Count of 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;
}

Order List对模数4计数2和3

您可以这样做:

  1. 建立一个有效的模数序列。这很简单:

     var modulusSequence = Enumerable.Range(0, modulus);
    
  2. 现在你需要一种方法来生成给定模量和长度的所有有效模序列。这也很简单,只要向左或向右移动总共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);
        }
    }
    
  3. 现在您只需检查给定序列是否包含有效序列的所有元素(注意,这样做是不正确的,因为如果给定序列具有重复项,您可能会得到假阳性)。如果是,则返回有效的序列。

    我注意到我没有排序你的列表,如果序列无效,我将返回一个新的或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;
    }
    

这个方法比你的方法更快/更有效吗?可能不会。它更漂亮吗?我是这么认为的,但这是有争议的。它更灵活吗?哦,是的!

如果你绝对确定你只需要用模量4检查23长序列,那么你可以保留你的代码。如果没有,那么实现一个通用的解决方案,就像我向您展示的那样。