2017-05-05 209 views
-1

我正在用这个打砖墙,而我似乎无法把头围住它。得到每一个第n个元素或最后一个

给定一个对象列表,我怎样才能得到从结尾开始的第三个元素(所以第三个到最后一个,第六个到最后一个等),但如果它到了最后,只剩下1或2个,返回第一个元素。

我本质上是试图模拟从股票中绘制三张牌,并在耐心的比赛中检查有效的移动,但由于某种原因,我正在与这一概念挣扎。

编辑:

到目前为止,我已经试过看着使用标准的for循环增加一步。这导致了我第二个需要,即如果最后一个循环中少于三个,就得到第一个元素。

我已经尝试了其他关于堆栈溢出的建议,以获得列表中的第n个元素,但是它们也都不提供第二个要求。

不完全确定哪些代码我可以发布,这不会是一个简单的循环。因为我的问题是代码的逻辑,而不是代码本身。

例如:

给出的列表 1,2,3,4,5,6,7,8,9,10

我想获得一个清单, 8,5 ,2,1 作为回报。

+0

要显示的任何代码? – MickyD

+0

你尝试过什么吗?即使这只是思考过程,告诉我们你到目前为止的。 – Kroltan

+0

我没想到需要这个代码,我认为它会很快。我会添加我迄今为止尝试过的这个。 – Ben

回答

1

伪代码:

List<object> filtered = new List<object>(); 
List<object> reversedList = myList.Reverse(); 
if(reversedList.Count % 3 != 0) 
{ 
    return reversedList.Last(); 
} 
else 
{ 
    for(int i = 3; i < reversedList.Count; i = i +3) 
{ 
    filterList.Add(reversedList[i]); 
} 
if(!filterList.Contains(reversedList.Last()) 
{ 
    filterList.Add(reversedList.Last()); 
} 
+0

嘿谢谢你的答复。猜猜我的文字在我的文章中仍然需要一些小小的工作。我希望这两种情况都会发生,所以它会循环遍历你的for循环,但是如果没有第三个元素,就得到第一个元素(因为我们倒退了,技术上第一个是最后一个)。我会稍微更新我的文章。 – Ben

+0

因此得到每一个第三项和最后一项,如果它不能被3整除?如果小于3,只返回最后一个? –

+0

是的,没错。我已经在我的问题中发布了一个示例,我希望将它清除一点 – Ben

1

尝试使用此代码 -

List<int> list = new List<int>(); 
List<int> resultList = new List<int>(); 
int count = 1; 
for (;count<=20;count++) { 
    list.Add(count); 
} 
for (count=list.Count-3;count>=0;count-=3) 
{ 
    Debug.Log(list[count]); 
    resultList.Add(list[count]); 
} 
if(list.Count % 3 > 0) 
{ 
    Debug.Log(list[0]); 
    resultList.Add(list[0]); 
} 
0

不得不尝试和使用LINQ做。 不确定它是否符合您的要求,但适用于您的示例。

 var list = Enumerable.Range(1, 10).ToList(); 
     //Start with reversing the order. 
     var result = list.OrderByDescending(x => x) 
      //Run a select overload with index so we can use position 
      .Select((number, index) => new { number, index }) 
      //Only include items that are in the right intervals OR is the last item 
      .Where(x => ((x.index + 1) % 3 == 0) || x.index == list.Count() - 1) 
      //Select only the number to get rid of the index. 
      .Select(x => x.number) 
      .ToList(); 

     Assert.AreEqual(8, result[0]); 
     Assert.AreEqual(5, result[1]); 
     Assert.AreEqual(2, result[2]); 
     Assert.AreEqual(1, result[3]); 
相关问题