关于模数4

时间:2016-09-17 11:48:18

标签: c# list

我有一个列表,如果它包含序列中的所有数字,我需要对它进行排序:

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

我知道如何命令列表升序或降序但是模数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;
}

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

  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长模数4的序列,那么您可以保留代码。如果没有,请实施一个通用解决方案,就像我向您展示的那样。