我碰巧看到了一些代码,其中这个人将lambda表达式传递给ArrayList.Sort(这里是IComparer)或IEnumerable.SequenceEqual(IEnumerable列表,IEqualityComparer here),其中需要IComparer或IEqualityComparer.
我不能确定我是否看过它,或者我只是在做梦.我似乎无法在这些集合中找到任何接受Func <>或其方法签名中的委托的扩展.
有这样的过载/扩展方法吗?或者,如果没有,是否有可能像这样捣乱并传递一个算法(读委托),其中预期单方法接口?
更新 谢谢大家.那正是我所想.我一定是在做梦.我知道如何编写转换.我只是不确定我是否见过这样的东西,或者只是觉得我已经看过了.
又一次更新 看,在这里,我找到了一个这样的实例.毕竟我并没有做梦.看看这家伙在这做什么.是什么赋予了?
这是另一个更新:
好的,我明白了.那家伙正在使用Comparison<T>超载.尼斯.很好,但完全容易误导你.不过很好.谢谢.
linq ienumerable extension-methods icomparer iequalitycomparer
我有一个DateTimeOffset对象列表,我想按顺序将新的列表插入到列表中.
List<DateTimeOffset> TimeList = ...
// determine the order before insert or add the new item
Run Code Online (Sandbox Code Playgroud)
对不起,需要更新我的问题.
List<customizedClass> ItemList = ...
//customizedClass contains DateTimeOffset object and other strings, int, etc.
ItemList.Sort(); // this won't work until set data comparison with DateTimeOffset
ItemList.OrderBy(); // this won't work until set data comparison with DateTimeOffset
Run Code Online (Sandbox Code Playgroud)
另外,如何把DateTimeOffset参数作为.OrderBy()?
我也尝试过:
ItemList = from s in ItemList
orderby s.PublishDate descending // .PublishDate is type DateTime
select s;
Run Code Online (Sandbox Code Playgroud)
但是,它会返回此错误消息,
无法将类型'System.Linq.IOrderedEnumerable'隐式转换为'System.Collections.Gerneric.List'.存在显式转换(您是否错过了演员?)
class p {
public string Name { get; set; }
public int Age { get; set; }
};
static List<p> ll = new List<p>
{
new p{Name="Jabc",Age=53},new p{Name="Mdef",Age=20},
new p{Name="Exab",Age=45},new p{Name="G123",Age=19}
};
protected static void SortList()
{
IComparer<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); <==(Line 1)
ll.Sort((x, y) => x.Name.CompareTo(y.Name));<==(Line 2)
}
Run Code Online (Sandbox Code Playgroud)
这里List.sort需要一个IComparer<p>as参数.并且它与lambda一起使用,如第2行所示.但是当我尝试按照第1行的方式执行时,我收到此错误:
无法将lambda表达式转换为System.Collections.Generic.IComparer类型,因为它不是委托类型
我调查了很长一段时间,但我仍然不明白.也许我对IComparer的理解不是很好.可以有人帮我一把吗?