原文:UsetheIComparableandIComparerinterfacesinVisualCSharp本文介绍了在VisualC#中如何使用IComparer和IComparable接口。概要本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不同的用途。如果你有一个支持IComparer的类型数组(例如字符串或整数),你可以对它进行排序而不需要提供任何对IComparer的显式引用(译注:意思是把一个IComparer的实现类作为参数传递给排序方法)。在这种情况下,数组元素会被转换为IComparer的
我想从我的XML文件中获取最高属性“ID”。我的代码:vardoc=XElement.Load("invoices.xml");varq=(fromfindoc.Element("ListOfInvoices").Elements("Invoice")orderbyf.Attributes("ID")descendingselectf.Attribute("ID")).FirstOrDefault();当我的XML文件中有一个发票代码有效时,但是例如2发票时我有一个错误:至少一个对象必须实现IComparable。 最佳答案 尝试将
我有课。这个类要表示的事物是这样的,我们可以谈论这样的事物彼此相等,我们也可以想出一个方案来对它们进行排名用于比较。然而,碰巧很少有人觉得需要对这些东西进行排序,但人们经常需要检查两个这样的东西是否相等。因此,我可以为我的类实现IEquatable以及IComparable。虽然IComparable提供了一些额外的功能,但不太可能有人会关心这些额外的功能。无论是在逻辑上还是在功能方面,两者似乎都没有提供明显的优势。我应该实现哪个接口(interface),IEquatable、IComparable或两者?为什么?(我特别想知道这两个接口(interface)对框架范围的影响)Thi
当我想将类型T约束为可比较时,我应该使用:whereT:IComparable或whereT:IComparable如果#2有意义,我无法理解。任何人都可以解释其中的区别是什么? 最佳答案 您可能需要两个约束,如:whereT:IComparable,IComparable这将使您的类型与IComparable的更多用户兼容接口(interface)。IComparable的通用版本,IComparable将有助于在T时避免装箱是一种值类型,允许接口(interface)方法的强类型实现。支持这两者可确保无论其他对象要求哪个接口(i
我有一个DataGridView,它的数据源是一个BindingList。MyObj有一些可为null的属性(如int?和DateTime?)我想对我的绑定(bind)列表进行排序,以便DataGridView可以在用户单击列标题时对列进行排序。经过一番挖掘,我发现并遵循了这个问题的答案(DataGridViewColumnsortingwithBusinessObjects)。我无法让该解决方案适用于Nullable类型,因为它们没有实现IComparable。即使对于像String这样实现IComparable的类,当String具有空值时ApplySortCore(...)也会失
我正在尝试创建一个简单的Clamp(以便我可以绑定(bind)任何可比较的值......主要用于数字类型,如int、double等)问题是如果我执行以下操作会出现错误,但是accordingtoMSDNIComparable的CompareTo应该能够处理空值。引述:“根据定义,任何对象比较大于null,并且两个null引用相互比较相等。”publicstaticTClamp(thisTvalue,Tmin,Tmax)whereT:IComparable{if(value.CompareTo(max)>0)returnmax;if(value.CompareTo(min)(0,9999
我正在尝试编写一个用于排序的通用对象比较器,但我注意到它不处理它比较的值之一为空的实例。当一个对象为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
我正在尝试编写一个通用的堆排序算法。我收到以下错误。可能是什么原因?ThetypeTcannotbeusedastypeparameterTinthegenerictypeormethodHeap.MainClass.MaxHeapify(T[],int,int).ThereisnoboxingortypeparameterconversionfromTtoSystem.IComparable(CS0314)(HeapSort) 最佳答案 您需要指定T必须实现的相同通用约束IComparable在HeapSort上功能以及:priv