在我的一些测试中,我需要检查列表的顺序,并执行类似这样的操作
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)
这里出现的问题是你无法与普通价值观相媲美.任何人都可以建议这样做.
干杯科林
你可以添加一个约束:
where T:IComparable
Run Code Online (Sandbox Code Playgroud)
然后<,您可以使用IComparable接口的CompareTo()方法而不是使用运算符.
我认为使用类似于方法的方法签名会更有意义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)
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |