重新排序从给定位置开始的列表

时间:2012-04-10 15:41:48

标签: c# list

列表:

List<int> list1 = new List<int>(){ 0, 1, 2, 3, 4, 5, 6 };

让我们说我们想重新排序它。开头应该是数字“2”

// 2,3,4,5,6,0,1

或在第5位

// 5,6,0,1,2,3,4

你是如何用C#做的?

原因:想象一下,你在列表中有一个给定数字的索引(数字3,索引3)。你想从右边得到第二个数字 - 它将是5。

不幸的是,如果起始编号 处的(编号5和6) - 将抛出超出范围的异常,因为没有7和8!

我们的想法是重新排序List!

  • 我们输入Nr。 5 - 我们得到0(5,6,0)。
  • 我们输入Nr。 6 - 我们得到1(6,0,1)等。

或者还有其他一些(阅读 - 更好)的方法来解决这个问题?

3 个答案:

答案 0 :(得分:4)

更好的方法是使用mod运算符%。当您将int除以另一个int时,这将为您提供余数。它的工作方式是这样的:

int nextIndex = (currentIndex + offset) % length;

因此,如果您当前的索引是5,那么您的偏移量是2,而您的长度是6,那么:

5 + 2 = 7
7 / 6 = 1 remainder 1 (or 7 mod 6 = 1)
therefore nextIndex = 1

答案 1 :(得分:3)

Linq可以很容易地做到这一点:

List<int> list1 = new List<int>(new[] { 0, 1, 2, 3, 4, 5, 6 });

var numToStart = 4;

//reorderedList will be {4,5,6,0,1,2,3}
var reorderedList = list1.Skip(numToStart).Concat(list1.Take(numToStart));

答案 2 :(得分:2)

您无需重新排序列表。您可以使用以下函数获取数字:

int GetNumber(List<int> list, int fromValue, int index) 
{
    return list[(list.IndexOf(fromValue) + index) % list.Count()];
}

您可以像这样调用函数:

List<int> list1 = new List<int>(new[] { 0, 1, 2, 3, 4, 5, 6 });
int number = GetNumber(list1, 5, 2); // number = 0