C# 比较通用方法c中的两个值#
我认为我的代码对于我想要实现的目标是不言自明的:C# 比较通用方法c中的两个值#,c#,generics,comparison,operators,operands,C#,Generics,Comparison,Operators,Operands,我认为我的代码对于我想要实现的目标是不言自明的: private bool Comparison<T>(T operatorOne, T operatorTwo, string operand) { switch (operand.ToLower()) { case "=": return operatorOne.Equals(operatorTwo); case
private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
{
switch (operand.ToLower())
{
case "=":
return operatorOne.Equals(operatorTwo);
case "<":
return operatorOne < operatorTwo;
case ">":
return operatorOne > operatorTwo;
case "contains":
return operatorOne.ToString().Contains(operatorTwo.ToString());
default:
return false;
}
}
私有布尔比较(T运算符one、T运算符two、字符串操作数)
{
开关(操作数.ToLower())
{
案例“=”:
返回运算符one.Equals(运算符two);
案例“”:
返回运算符one>operatorTwo;
案例“包含”:
返回运算符one.ToString().Contains(运算符two.ToString());
违约:
返回false;
}
}
这给了我一个错误:
Error 16 Operator '>','<' cannot be applied to operands of type 'T' and 'T'
Error 16运算符'>','可用于比较。请注意,如果T
未实现IComparable
和IComparable
,Comparer.Default.Compare
将抛出异常
要确保T
实现IComparable
,可以在其中添加T:IComparable
约束。(它将排除实现IComparable
,但不实现IComparable
的类。仍然可以接受,因为许多实现IComparable
的类也实现了IComparable
。)
私有布尔比较(T运算符one、T运算符two、字符串操作数)
其中T:i可比较
{
开关(操作数.ToLower())
{
案例“=”:
返回Comparer.Default.Compare(运算符一、运算符二)=0;
案例“”:
返回Comparer.Default.Compare(运算符一、运算符二)>0;
案例“包含”:
返回运算符one.ToString().Contains(运算符two.ToString());
违约:
返回false;
}
}
p.S.
按照Servy的建议,您还可以将IComparer
作为额外参数传递给函数。它将允许覆盖既不实现IComparable
也不实现IComparable
的类型,因此Comparer.Default
对它们不起作用
此外,Timothyshiels还推荐了Comparer.Default(默认值)
“运算符”和“操作数”的概念。在表达式a+b
中,a
和b
是操作数,+
是运算符。是的,对不起!!我的错:)你对T了解多少,如果你规定T:IComparable在哪里,你也许可以不受惩罚。@mrtig T在我的例子中只能是int,double,float,decimal,string,char@isumit使用Comparer.Default,您甚至可以删除where
约束。@AlexD您可以,但不应该,除非您接受IComparer
作为参数。如果类型未实现IComparable
,则给定代码将在运行时失败;有了泛型约束,如果使用了不合适的类型,代码将在编译时失败。@Servy我刚刚编辑了答案。这里的一个小问题是Comparer.Default.Compare
可能返回IComparable
或IComparable
,这很难通过where
约束来表达。我们可以说,其中IComparable
,因为实现IComparable
的类通常也实现IComparable
。但它仍然打开了一个只实现了IComparable
的角落。@AlexD这就是为什么我总是接受比较器作为参数,而不是期望实现默认比较器的原因。你可以看到BCL也在做同样的事情。这允许使用未实现任何一个接口的类型。@Servy您的意思是将比较器作为Comparison
函数的额外参数吗?当然,这种比较器可以进行任何比较,但它会更改函数签名。
private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
where T: IComparable
{
switch(operand.ToLower())
{
case "=":
return Comparer<T>.Default.Compare(operatorOne, operatorTwo) == 0;
case "<":
return Comparer<T>.Default.Compare(operatorOne, operatorTwo) < 0;
case ">":
return Comparer<T>.Default.Compare(operatorOne, operatorTwo) > 0;
case "contains":
return operatorOne.ToString().Contains(operatorTwo.ToString());
default:
return false;
}
}