Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C中的给定计数器在循环方法中正确迭代枚举值#_C#_Enums - Fatal编程技术网

C# 如何使用C中的给定计数器在循环方法中正确迭代枚举值#

C# 如何使用C中的给定计数器在循环方法中正确迭代枚举值#,c#,enums,C#,Enums,我对这个问题做了仔细的研究,但找不到任何解决办法 我们有一个星期一的枚举 Sunday = 0 Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 现在我想给出一个10的计数器和一个周五的随机起始点,只是一个例子,我想得到这个输出 Friday Saturday Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday 正如Ma

我对这个问题做了仔细的研究,但找不到任何解决办法

我们有一个星期一的枚举

Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
现在我想给出一个10的计数器和一个周五的随机起始点,只是一个例子,我想得到这个输出

Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

正如Mathias R.Jessen所提到的,您可以通过
%7
操作来完成

public static IEnumerable<DayOfWeek> GetDaySequence(DayOfWeek startDay, int count)
{
    return Enumerable.Range(0, count).Select(i => (DayOfWeek)(((int)startDay + i) % 7));
}


正如Mathias R.Jessen所提到的,您可以通过
%7
操作来完成

public static IEnumerable<DayOfWeek> GetDaySequence(DayOfWeek startDay, int count)
{
    return Enumerable.Range(0, count).Select(i => (DayOfWeek)(((int)startDay + i) % 7));
}


下面的通用方法解决方案允许您编写如下内容:

foreach (var day in EnumRange(DayOfWeek.Sunday, 12))
{
    Console.WriteLine(day);
}
它允许非顺序枚举,例如,范围定义如下:

enum NotSequential
{
    Hi = 1,
    Bye = 7,
    AnotherValue = 12
}
使用整数将提供更好的性能,但在上述情况下会中断

请注意,C#中没有可用的
where T:enum
约束,因此编译器接受调用
EnumRange(3,5)
,并将给出运行时异常。解决方案不向后计数,因此
count
必须
>=0

static IEnumerable<T> EnumRange<T>(T start, int count)
    where T : struct //cannot use where Enum or similar
{
    if (count < 0)
        throw new ArgumentException("Count must be 0 or greater", nameof(count));
    var values = Enum.GetValues(typeof (T)).Cast<T>().ToList();
    var startIndex = values.IndexOf(start);
    if (startIndex == -1) 
        throw new ArgumentException($"Value {start} not defined by enum type {typeof(T)}", nameof(start));

    for (var i = startIndex; i < startIndex + count; i++)
    {
        yield return values[i%values.Count];
    }            
}
静态IEnumerable枚举范围(T开始,int计数)
其中T:struct//不能使用where Enum或类似的
{
如果(计数<0)
抛出新ArgumentException(“计数必须为0或更大”,nameof(计数));
var values=Enum.GetValues(typeof(T)).Cast().ToList();
var startIndex=values.IndexOf(开始);
如果(startIndex==-1)
抛出新ArgumentException($“值{start}未由枚举类型{typeof(T)}定义”,nameof(start));
对于(变量i=startIndex;i
下面的通用方法解决方案允许您编写如下内容:

foreach (var day in EnumRange(DayOfWeek.Sunday, 12))
{
    Console.WriteLine(day);
}
它允许非顺序枚举,例如,范围定义如下:

enum NotSequential
{
    Hi = 1,
    Bye = 7,
    AnotherValue = 12
}
使用整数将提供更好的性能,但在上述情况下会中断

请注意,C#中没有可用的
where T:enum
约束,因此编译器接受调用
EnumRange(3,5)
,并将给出运行时异常。解决方案不向后计数,因此
count
必须
>=0

static IEnumerable<T> EnumRange<T>(T start, int count)
    where T : struct //cannot use where Enum or similar
{
    if (count < 0)
        throw new ArgumentException("Count must be 0 or greater", nameof(count));
    var values = Enum.GetValues(typeof (T)).Cast<T>().ToList();
    var startIndex = values.IndexOf(start);
    if (startIndex == -1) 
        throw new ArgumentException($"Value {start} not defined by enum type {typeof(T)}", nameof(start));

    for (var i = startIndex; i < startIndex + count; i++)
    {
        yield return values[i%values.Count];
    }            
}
静态IEnumerable枚举范围(T开始,int计数)
其中T:struct//不能使用where Enum或类似的
{
如果(计数<0)
抛出新ArgumentException(“计数必须为0或更大”,nameof(计数));
var values=Enum.GetValues(typeof(T)).Cast().ToList();
var startIndex=values.IndexOf(开始);
如果(startIndex==-1)
抛出新ArgumentException($“值{start}未由枚举类型{typeof(T)}定义”,nameof(start));
对于(变量i=startIndex;i
先生,你能澄清你的答案吗?我会更新的,对不起先生,你能澄清你的答案吗?我会更新的,对不起,我怎么称呼这个方法?我还不熟悉IEnumerable接口,我是通过将方法返回值存储到var并使用foreach语句循环来实现的,这个解决方案非常快速和简单。这解决了我的问题。我如何调用此方法?我还不熟悉IEnumerable接口,我是通过将方法返回值存储到var并使用foreach语句循环来实现的,这个解决方案非常快速和简单。这就解决了我的问题。在不使用linq的情况下,这个逻辑解释了有关枚举数据序列的更多细节。这与@Kote Thank提供的输出相同。@Roelzkie请注意,如果枚举的值没有定义为从0开始的直序列,则会破坏他的答案。在不使用linq的情况下,此逻辑将解释有关枚举数据序列的更多细节。这与@Kote Thank提供的输出相同。@Roelzkie要注意的是,枚举的值没有以0开始的直接序列定义,这将破坏他的答案。