原文:UsetheIComparableandIComparerinterfacesinVisualCSharp本文介绍了在VisualC#中如何使用IComparer和IComparable接口。概要本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不同的用途。如果你有一个支持IComparer的类型数组(例如字符串或整数),你可以对它进行排序而不需要提供任何对IComparer的显式引用(译注:意思是把一个IComparer的实现类作为参数传递给排序方法)。在这种情况下,数组元素会被转换为IComparer的
在我开始重新发明轮子之前,是否有一些框架方法可以创建IComparer来自Func?编辑IIRC(已经有一段时间了)Java支持匿名接口(interface)实现。C#中是否存在这样的构造,或者委托(delegate)是否被视为一个完整的替代方案? 最佳答案 在即将推出的.NET4.5(VisualStudio2012)中,这可以通过静态工厂方法实现Comparer.Create.例如IComparercomp=Comparer.Create((p1,p2)=>p1.Age.CompareTo(p2.Age));
我正在尝试编写一个用于排序的通用对象比较器,但我注意到它不处理它比较的值之一为空的实例。当一个对象为null时,我希望它像对待空字符串一样对待它。我已尝试将空值设置为String.Empty,但随后在调用CompareTo()时出现“对象必须是字符串类型”的错误。publicintCompare(Tx,Ty){PropertyInfopropertyInfo=typeof(T).GetProperty(sortExpression);IComparableobj1=(IComparable)propertyInfo.GetValue(x,null);IComparableobj2=(I
采用自定义IComparer,如果两个double的差异小于给定的epsilon,则将其视为相等。如果在OrderBy().ThenBy()子句中使用此IComparer会发生什么情况?具体来说,我在考虑以下实现:publicclassEpsilonComparer:IComparer{privatereadonlydoubleepsilon;publicEpsilonComparer(doubleepsilon){this.epsilon=epsilon;}publicintCompare(doubled1,doubled2){if(Math.Abs(d1-d2)现在这个ICompa
我在为SortedDictionary使用自定义IComparer时遇到困难。目标是将特定格式的电子邮件地址(firstnam.lastname@domain.com)作为键,并按姓氏排序。当我做这样的事情时:publicclassProgram{publicstaticvoidMain(string[]args){SortedDictionarylist=newSortedDictionary(newSortEmailComparer());list.Add("a.johansson@domain.com","value1");list.Add("b.johansson@domain
首先,我确实知道Fisher-Yates洗牌。但是为了争论起见,我想允许用户从下拉列表中选择一个排序选项。该列表将包括一个“随机”选项。根据他们的选择结果,我只想用IComparer实例代替我的排序。IComparer会是什么样子?Google提出了大量有缺陷的结果,这些结果都采用这种形式:publicclassNaiveRandomizer:IComparer{privatestaticRandomrand=newRandom();publicintCompare(Tx,Ty){return(x.Equals(y))?0:rand.Next(-1,2);}}但是,这种实现是有偏见的,
在编写比较器类时,从4.0版开始的C#中的最佳实践是什么:一个。我们应该继承Comparer抽象类吗?或我们是否应该实现IComparer接口(interface)。有什么优点和缺点? 最佳答案 我建议您扩展Comparer类而不是实现IComparer界面,与Microsoft一样(参见下面的第一个引用资料)。现在,如果您希望您的对象本身(无论T是什么)能够与自身进行比较,它可以实现IComparable接口(interface)(参见下面的第二个引用)。发件人:http://msdn.microsoft.com/en-us/li
我正在尝试对派生自CollectionViewSource的集合进行排序,该集合仅具有用于排序的SortDescriptions。不幸的是,我需要能够使用我自己的自定义IComparer,但我似乎无法找到一种方法来做到这一点。想想数据网格,我有自己的多列排序算法。我在想一种方法是使用实现CollectionChanged的集合,它是CollectionViewSource和我的真实数据源之间的附加层,但如果有人有任何建议,我真的更喜欢更好的方法。 最佳答案 BeaStollnitz有一个自定义排序示例here.那篇文章的重点
我在C#中使用lambda表达式对数组进行排序和搜索。我不想在我的类中实现IComparer接口(interface),因为我需要对多个成员字段进行排序和搜索。classWidget{publicintfoo;publicvoidBar(){Widget[]widgets;Array.Sort(widgets,(a,b)=>a.foo.CompareTo(b.foo));Widgetx=newWidget();x.foo=5;intindex=Array.BinarySearch(widgets,x,(a,b)=>a.foo.CompareTo(b.foo));}}虽然排序工作正常,但
为什么匿名函数可以作为方法的参数,而不是构造函数的参数?如果我创建一个List,它有一个带有以下签名的排序方法:publicvoidSort(IComparercomparer)以下工作的地方:Listlist=newList();list.Sort((a,b)=>a.CompareTo(b));SortedSet有一个具有类似签名的构造函数:publicSortedSet(IComparercomparer)但是在构造函数中使用匿名函数时会失败。以下内容无效:SortedSetset=newSortedSet((a,b)=>a.CompareTo(b));创建排序类按预期正常工作:p