在我的一些测试中,我需要检查列表的顺序并执行类似这样的操作
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;
}
这里出现的问题是你无法与普通价值观相媲美。任何人都可以建议这样做。
干杯 科林
答案 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;
}