IsOrderedBy扩展方法

pyt*_*ips 3 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;
}
Run Code Online (Sandbox Code Playgroud)

我想做什么我把它变成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;
}
Run Code Online (Sandbox Code Playgroud)

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

干杯科林

Phi*_*ert 5

你可以添加一个约束:

where T:IComparable
Run Code Online (Sandbox Code Playgroud)

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


Tho*_*que 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;
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以这样使用它:

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");
Run Code Online (Sandbox Code Playgroud)