简体   繁体   English

C#中的Enum和IEnumerable

[英]Enum and IEnumerable in C#

my TIME Enum contains Annual, Monthly, weekly, daily and Hourly. 我的时间枚举包含每年,每月,每周,每天和每小时。

Here I want to decide which is the minimum and want to return that. 在这里,我想决定哪一个是最小的,并希望将其返回。

How can I do this ? 我怎样才能做到这一点 ? Here is the code I tried. 这是我尝试的代码。

private Time DecideMinTime(IEnumerable<Time> g)
{
    var minTime = Time.Hourly;
    foreach (var element in g)
    {
        minTime = element;
    }
    return minTime;
}   

Assuming that the numeric value of the enum elements decides what the minimum is: 假设枚举元素的数值决定最小值是什么:

private Time DecideMinTime(IEnumerable<Time> g)
{
    if (g == null) { throw new ArgumentNullException("g"); }

    return (Time)g.Cast<int>().Min();
}

If the numeric values indicate the opposite order then you would use .Max() instead of .Min() . 如果数值指示相反的顺序,则应使用.Max()而不是.Min()


As indicated, the numeric order is not consistent. 如图所示,数字顺序不一致。 This can be worked around simply by using a mapping indicating the correct order: 可以通过使用指示正确顺序的映射来解决此问题:

static class TimeOrdering
{
    private static readonly Dictionary<Time, int> timeOrderingMap;

    static TimeOrdering()
    {
        timeOrderingMap = new Dictionary<Time, int>();

        timeOrderingMap[Time.Hourly] = 1;
        timeOrderingMap[Time.Daily] = 2;
        timeOrderingMap[Time.Weekly] = 3;
        timeOrderingMap[Time.Monthly] = 4;
        timeOrderingMap[Time.Annual] = 5;
    }

    public Time DecideMinTime(IEnumerable<Time> g)
    {
        if (g == null) { throw new ArgumentNullException("g"); }

        return g.MinBy(i => timeOrderingMap[i]);
    }

    public TSource MinBy<TSource, int>(
        this IEnumerable<TSource> self,
        Func<TSource, int> ordering)
    {
        if (self == null) { throw new ArgumentNullException("self"); }
        if (ordering == null) { throw new ArgumentNullException("ordering"); }

        using (var e = self.GetEnumerator()) {
            if (!e.MoveNext()) {
                throw new ArgumentException("Sequence is empty.", "self");
            }

            var minElement = e.Current;
            var minOrder = ordering(minElement);

            while (e.MoveNext()) {
                var curOrder = ordering(e.Current);

                if (curOrder < minOrder) {
                    minOrder = curOrder;
                    minElement = e.Current;
                }
            }

            return minElement;
        }
    }
}

To make it easier you can assign int values to your enum: 为了简化操作,您可以将int值分配给枚举:

enum Time : byte {Hourly=1, Daily=2, Weekly=3, Monthly=4, Annual=5};

and then 接着

private static Time DecideMinTime(IEnumerable<Time> g)
{            
   return g.Min();                        
}

That way you avoid casting back and forth. 这样,您就可以避免来回拖延。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM