您好我想从一个包含5个项目的列表中获取6个项目。我想开始在给定位置拍摄物品。我的结果应保存在另一个列表中。
例如:
List_1 = 1, 2, 3, 4, 5
需要6项
从位置2 {= 3}
开始
List_result = 3, 4, 5, 1, 2, 3
List_1 = 7, 13, 6, 9, 17
2 items needed
从位置4 {= 17}
开始
List_result = 17, 7
我已经尝试使用for和foreach遍历列表,但找不到真正的解决方案。非常感谢任何帮助!
答案 0 :(得分:0)
这样的事情可以解决问题。我写得很快,所以我相信你可以做得更好
private IEnumerable<int> DoSomething(IEnumerable<int> set, int start, int num) {
var taken = 0;
var curSet = set.Skip(start);
while (taken < num) {
foreach(var current in curSet)
{
if (taken == num)
yield break;
yield return current;
taken++;
}
curSet = set;
}
}
像这样使用:
DoSomething(new int[] { 1,2,3,4,5}, 2, 6);
产量:
3,4,5,1,2,3
答案 1 :(得分:0)
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
var data = new List<int>(5){1,2,3,4,5};
var result = new List<int>(5);
for(int i=0;i<5;i++)
{
result.Add(data[(i+2)%data.Count]);
}
for(int i=0;i<result.Count;i++)
{
Console.WriteLine(string.Format("{0}\n",result[i]));
}
}
}
答案 2 :(得分:0)
简单,
public static IEnumerable<T> TakeLoop<T>(
this IEnumerable<T> source,
int count,
int start = 0)
{
if (start < 0)
{
throw new ArgumentOutOfRangeException("start");
}
if (count < 0)
{
throw new ArgumentOutOfRangeException("count");
}
using (var m = source.GetEnumerator())
{
for (var i = 0; i < count + start; i++)
{
if (!m.MoveNext())
{
if (i < start)
{
throw new ArgumentOutOfRangeException("start");
}
m.Reset();
m.MoveNext();
}
if (i >= start)
{
yield return m.Current;
}
}
}
}
要像这样使用
var result1 = (new[] { 1, 2, 3, 4, 5 }).TakeLoop(6, 3);
或者,
var result2 = (new[] { 7, 13, 6, 9, 17 }).TakeLoop(2, 4);
答案 3 :(得分:0)
您可以使用此扩展程序:
public static IEnumerable<T> TakeSpinning<T>(this IEnumerable<T> source, int take, int position = 0)
{
// skip check for invalid input like negative take or position
int skip = position;
int taken = 0;
while (taken < take)
{
foreach (T element in source)
{
if (skip > 0)
{
skip--;
continue;
}
yield return element;
if (++taken == take) break;
}
}
}
您的样品:
var List_1 = new List<int> { 1, 2, 3, 4, 5 };
var List_Result = List_1.TakeSpinning(6, 2).ToList(); // 3,4,5,1,2,3
var List_2 = new List<int> { 7, 13, 6, 9, 17 };
var List_Result2 = List_2.TakeSpinning(2, 4).ToList(); // 17,7
答案 4 :(得分:-1)
它是一个简单的迭代,你可以使用一个简单的循环来做到这一点:
List list;// add values
int itemNeeded; //set item need
int startPostion; //set the start postion
for(int i=0;i<itemNeeded;i++){
add to newList the item at (startPosition++ % length of list)
}