IsOrderedBy扩展方法

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

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(this IEnumerable value, TestType initalValue) { TestType lastValue = initalValue; foreach (T enumerable in value) { if(enumerable < lastValue) { return false; } lastValue = value; } return true; } 

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

干杯科林

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

 public static bool IsOrderedBy(this IEnumerable source, Func 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.Default.Compare(previousKey, key) > 0) return false; } isFirstPass = false; previous = item; } return true; } 

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

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

你可以添加一个约束:

 where T:IComparable 

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

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

 public static bool IsOrderedBy(this IEnumerable value, T initalValue) where T : IComparable { var currentValue = initialValue; foreach(var i in value) { if (i.CompareTo(currentValue) < 0) return false; currentValue = i; } return true; }