原文: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。 最佳答案 尝试将
在我开始重新发明轮子之前,是否有一些框架方法可以创建IComparer来自Func?编辑IIRC(已经有一段时间了)Java支持匿名接口(interface)实现。C#中是否存在这样的构造,或者委托(delegate)是否被视为一个完整的替代方案? 最佳答案 在即将推出的.NET4.5(VisualStudio2012)中,这可以通过静态工厂方法实现Comparer.Create.例如IComparercomp=Comparer.Create((p1,p2)=>p1.Age.CompareTo(p2.Age));
我有课。这个类要表示的事物是这样的,我们可以谈论这样的事物彼此相等,我们也可以想出一个方案来对它们进行排名用于比较。然而,碰巧很少有人觉得需要对这些东西进行排序,但人们经常需要检查两个这样的东西是否相等。因此,我可以为我的类实现IEquatable以及IComparable。虽然IComparable提供了一些额外的功能,但不太可能有人会关心这些额外的功能。无论是在逻辑上还是在功能方面,两者似乎都没有提供明显的优势。我应该实现哪个接口(interface),IEquatable、IComparable或两者?为什么?(我特别想知道这两个接口(interface)对框架范围的影响)Thi
当我想将类型T约束为可比较时,我应该使用:whereT:IComparable或whereT:IComparable如果#2有意义,我无法理解。任何人都可以解释其中的区别是什么? 最佳答案 您可能需要两个约束,如:whereT:IComparable,IComparable这将使您的类型与IComparable的更多用户兼容接口(interface)。IComparable的通用版本,IComparable将有助于在T时避免装箱是一种值类型,允许接口(interface)方法的强类型实现。支持这两者可确保无论其他对象要求哪个接口(i
我正在尝试创建一个简单的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
首先,我确实知道Fisher-Yates洗牌。但是为了争论起见,我想允许用户从下拉列表中选择一个排序选项。该列表将包括一个“随机”选项。根据他们的选择结果,我只想用IComparer实例代替我的排序。IComparer会是什么样子?Google提出了大量有缺陷的结果,这些结果都采用这种形式:publicclassNaiveRandomizer:IComparer{privatestaticRandomrand=newRandom();publicintCompare(Tx,Ty){return(x.Equals(y))?0:rand.Next(-1,2);}}但是,这种实现是有偏见的,