从列表中获取的项目数量超过列表实际数量

时间:2014-11-10 14:04:19

标签: c# list

您好我想从一个包含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遍历列表,但找不到真正的解决方案。非常感谢任何帮助!

5 个答案:

答案 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)
}