C# 从月份数组中获取一系列值

C# 从月份数组中获取一系列值,c#,performance,algorithm,arrays,C#,Performance,Algorithm,Arrays,我创建了一个数组[FrameworkVersion2.0,C#2.0],它存储一年中的月份,就像这样 来源 我正在寻找一种从这个静态列表中检索IEnumerable的方法,它返回一个月的范围。我可以想出很多方法,但我在这里找到一个让我去瓦赫。。。 方法的签名看起来像 签名 public IEnumerable GetRange(intstartindex,intendindex) 样本I/O 注意:数组。复制很简洁,但参数的使用方式让它变得古怪 Parameters sourceArray

我创建了一个数组[FrameworkVersion2.0,C#2.0],它存储一年中的月份,就像这样

来源 我正在寻找一种从这个静态列表中检索
IEnumerable
的方法,它返回一个
月的范围。我可以想出很多方法,但我在这里找到一个让我去瓦赫。。。
方法的签名看起来像

签名
public IEnumerable GetRange(intstartindex,intendindex)

样本I/O 注意:
数组。复制
很简洁,但参数的使用方式让它变得古怪

Parameters

sourceArray

    The Array that contains the data to copy.

sourceIndex

    A 32-bit integer that represents the index in the sourceArray at which copying begins.

destinationArray

    The Array that receives the data.

destinationIndex

    A 32-bit integer that represents the index in the destinationArray at which storing begins.

length

    A 32-bit integer that represents the number of elements to copy.

您可以使用Skip和Take扩展方法:

public IEnumerable<String> GetRange(int startIndex, int endIndex)
{
    return months.Skip(startIndex).Take(endIndex - startIndex + 1);
}
public IEnumerable GetRange(int-startIndex,int-endIndex)
{
返回月份.跳过(startIndex).Take(endIndex-startIndex+1);
}

(可能需要针对基于1的索引进行调整)

如果要使用数组。复制您可以这样做:

public IEnumerable<String> GetRange(int startIndex, int endIndex)
{
    int numToCopy = endIndex - startIndex + 1;
    string[] result = new string[numToCopy];
    Array.Copy(Months, startIndex - 1, result, 0, numToCopy); // startIndex - 1 because Array indexes are 0-based, and you want the first element to be indexed with 1
    return result;
}
public IEnumerable GetRange(int-startIndex,int-endIndex)
{
int numToCopy=endIndex-startIndex+1;
字符串[]结果=新字符串[numToCopy];
Copy(Months,startIndex-1,result,0,numToCopy);//startIndex-1,因为数组索引是基于0的,并且您希望第一个元素使用1进行索引
返回结果;
}

这适用于.NET 2.0。您想做以下工作吗

    public static IEnumerable<String> GetRange(int startIndex, int endIndex)
    {
        List<string> rv = new List<string>();
        for (int i=startIndex+1;i<=endIndex;i++)
            rv.Add(System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i));
        return rv;
    }
公共静态IEnumerable GetRange(int startIndex,int endIndex)
{
List rv=新列表();

对于(inti=startIndex+1;i我要感谢每一位用心回答我问题的人-
谢谢
下面是使用内部对象为我工作的代码

在范围内获取
公共静态IEnumerable GetRange(短startIndex、短endIndex)
{
/*案例
*结束>开始
*结束>边界
*开始<边界
*开始!=结束
*/
如果(startIndex>endIndex | | endIndex>Months.Length | | startIndex<0 | | startIndex==endIndex)
{
抛出新ArgumentOutOfRangeException(“startIndex”,“为开始和结束索引提供了无效参数”);
}
对于(int rangeCount=startIndex-1;rangeCount
从给定索引提取到最后
publicstaticIEnumerablegetfrom(intstartindex)
{
如果(开始索引<0 | |开始索引>个月。长度-1)
{
抛出新ArgumentOutOfRangeException(“startIndex”,“开始索引不能大于年中月份的界限”);
}
对于(int rangeCount=startIndex-1;rangeCount
我想知道我是否可以在内部使用范围内获取方法 从索引方法获取


它们是随Linq一起提供的,是吗?对不起,我忘了提到框架版本SKIP和Take是可用的,因为.NET 3.5您可以使用CultureInfo.DateTimeFormat.MonthNames,而不是使用.NET 2.0,也就是说,对@Deeptechtons没有Linq和varmy的同情-我已经修改了我的答案,使其与2.0一起工作,我知道,但另一个数组可以保存结果阻止我做这件事。
public IEnumerable<String> GetRange(int startIndex, int endIndex)
{
    int numToCopy = endIndex - startIndex + 1;
    string[] result = new string[numToCopy];
    Array.Copy(Months, startIndex - 1, result, 0, numToCopy); // startIndex - 1 because Array indexes are 0-based, and you want the first element to be indexed with 1
    return result;
}
    public static IEnumerable<String> GetRange(int startIndex, int endIndex)
    {
        List<string> rv = new List<string>();
        for (int i=startIndex+1;i<=endIndex;i++)
            rv.Add(System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i));
        return rv;
    }
public static IEnumerable<string> GetRange(short startIndex, short endIndex)
    {
        /*Cases
         * end > start
         * end > bounds
         * start < bounds
         * start != end
         */
        if (startIndex > endIndex || endIndex > Months.Length || startIndex < 0 || startIndex == endIndex)
        {
            throw new ArgumentOutOfRangeException("startIndex", "Invalid arguments were supplied for Start and End Index");
        }
        for (int rangeCount = startIndex-1; rangeCount < endIndex; rangeCount++)
        {
            yield return Months[rangeCount];
        }
    }
public static IEnumerable<string> GetFrom(int startIndex)
{
    if (startIndex < 0 || startIndex > Months.Length - 1)
    {
        throw new ArgumentOutOfRangeException("startIndex", "Start Index cannot be greater than the Bounds of the months in year");
    }

    for (int rangeCount = startIndex - 1; rangeCount < Months.Length; rangeCount++)
    {
        yield return Months[rangeCount];
    }
}