IsOrderedBy扩展方法

时间:2009-07-04 17:28:15

标签: c# generics

在我的一些测试中,我需要检查列表的顺序并执行类似这样的操作

DateTime lastDate = new DateTime(2009, 10, 1);
foreach (DueAssigmentViewModel assignment in _dueAssigments)
{
    if (assignment.DueDate < lastDate)
    {
        Assert.Fail("Not Correctly Ordered");
    }
    lastDate = assignment.DueDate;
}

我想做什么我把它变成IEnumerable上的扩展方法,使其可重用。

我的初衷是

public static bool IsOrderedBy<T, TestType>(this IEnumerable<T> value, TestType initalValue)
{
    TestType lastValue = initalValue;
    foreach (T enumerable in value)
    {
        if(enumerable < lastValue)
        {
            return false;
        }
        lastValue = value;
    }
    return true;
}

这里出现的问题是你无法与普通价值观相媲美。任何人都可以建议这样做。

干杯 科林

3 个答案:

答案 0 :(得分:5)

你可以添加一个约束:

where T:IComparable

然后,您可以使用IComparable接口的CompareTo()方法,而不是使用<运算符。

答案 1 :(得分:5)

我认为使用类似于OrderBy方法的方法签名更有意义...

public static bool IsOrderedBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    bool isFirstPass = true;
    TSource previous = default(TSource);

    foreach (TSource item in source)
    {
        if (!isFirstPass)
        {
            TKey key = keySelector(item);
            TKey previousKey = keySelector(previous);
            if (Comparer<TKey>.Default.Compare(previousKey, key) > 0)
                return false;
        }
        isFirstPass = false;
        previous = item;
    }

    return true;
}

然后你可以这样使用它:

List<Foo> list = new List<Foo>();
...

if (list.IsOrderedBy(f => f.Name))
   Console.WriteLine("The list is sorted by name");
else
   Console.WriteLine("The list is not sorted by name");

答案 2 :(得分:1)

你应该这样做(我不明白为什么TestType应该与T不同):

public static bool IsOrderedBy<T>(this IEnumerable<T> value, T initalValue)
      where T : IComparable<T> {

      var currentValue = initialValue;

      foreach(var i in value) {
           if (i.CompareTo(currentValue) < 0)
                return false;
           currentValue = i;
      }

      return true;
}