如何解决比较两个类对象的值“大于”
我有两个类,其中包含12个月的对象名称,其值是十进制。我必须检查A类对象是否大于B类对象。
Class A
{
decimal Jan;
decimal Feb;
decimal Mar;
}
Class B
{
decimal Jan;
decimal Feb;
decimal Mar;
}
现在,我正在对所有对象使用if循环来检查验证。
if(A.Jan > B.Jan)
{
return false;
}
else if(A.Feb > B.Feb)
{
return false;
}
else if(A.Mar > B.Mar)
{
return false;
}
是否有任何机制可以简化此逻辑。
解决方法
也许在两个类中实现了一个函数,该函数返回月值的集合。然后,您可以将它们一一比较。
void Main()
{
var a = new A() { Jan = 1,Feb = 1,Mar = 5 };
var b = new B() { Jan = 1,Mar = 3 };
Compare(a,b).Dump();
}
private bool Compare(A a,B b)
{
var ae = a.GetMonthValues().GetEnumerator();
var be = b.GetMonthValues().GetEnumerator();
while (ae.MoveNext() & be.MoveNext())
{
if (ae.Current > be.Current)
return false;
}
return true;
}
class A
{
public decimal Jan;
public decimal Feb;
public decimal Mar;
public IEnumerable<decimal> GetMonthValues() => new[] { Jan,Feb,Mar };
}
class B
{
public decimal Jan;
public decimal Feb;
public decimal Mar;
public IEnumerable<decimal> GetMonthValues() => new[] { Jan,Mar };
}
您还可以使用GetMonthValues
函数提取接口,并让两个类都实现该接口。 (以及所需的月份属性)
您可以使用运算符重载来做到这一点-像这样:
inline bool operator< (const A& lhs,const B& rhs)
{
/* do actual comparison */
}
查看此问题和答案
What are the basic rules and idioms for operator overloading?
您还可以在界面上使用以下模式:
interface ExtractDate<T>
{
decimal getDate(integer which);
}
Class A : ExtractDate<A>
{
decimal getDate(integer which)
{
switch (which)
{
case 1 : return this.Jan; break;
case 2 : return this.Feb; break;
case 3 : return this.Mar; break;
}
}
decimal Jan; decimal Feb; decimal Mar;
}
Class B : ExtractDate<B>
{
decimal getDate(integer which)
{
switch (which)
{
case 1 : return this.Jan; break;
case 2 : return this.Feb; break;
case 3 : return this.Mar; break;
}
}
decimal Jan; decimal Feb; decimal Mar;
}
那你可以说
if(A.getDate(1) > B.getDate(1))
{
return false;
}
//etc
如果是我,这似乎需要做很多工作-我自己将创建一个名为DateInfo的对象,并让两个对象实现该对象(两个对象中的对象相同),然后比较相同类型的对象-这要容易得多。
,您可以将A类和B类合并为一个类,然后重载比较运算符,如下所示:
# admin.py
class PostAdminForm(forms.ModelForm):
text = forms.CharField(widget=forms.Textarea)
class Meta:
model = Post
fields = '__all__'
class PostAdmin(admin.ModelAdmin):
form = PostAdminForm
我还介绍了这几个月的清单,因此您不必单独地将它们分开
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。