gpt4 book ai didi

c# - 无法比较数组中的 2 个对象(与继承和泛型比较)

转载 作者:行者123 更新时间:2023-11-30 18:43:18 24 4
gpt4 key购买 nike

情况是我有 2 个类(一个基类和一个从基类继承的派生类)。这两个类都实现了 CompareTo 方法,所以我基本上可以对列表进行排序。

基类包含以下值:

day, month  and year

派生类继承了这 3 个并增加了 2 个:

hours and minutes

问题是当我在列表中添加 Date 和 DateTime 对象时,它只能在年月日正确排序。

包含(日、月、年、小时和分钟)的 DateTime 对象仅对基本属性进行正确排序,其中根本没有对小时和分钟进行排序。

但是当我评论所有 Date 对象并且只添加 DateTime 对象时,整个排序都正确完成......

当我在基本方法中使用 Virtual 并在派生 calss 中使用 override(在 CompareTo 方法上)时,出现错误“无法比较数组中的 2 个对象” )

代码:

程序.cs:

    List<Date> slDate = new List<Date>();

slDate.Add(new Date(1, 2, 2011));
slDate.Add(new Date(06, 01, 2000));

slDate.Add(new DateTijd(10, 11, 2011, 5, 20));
slDate.Add(new DateTijd(8, 11, 2011, 20, 01));
slDate.Add(new DateTijd(8, 11, 2011, 20, 30));


slDate.Sort();

for (int i = 0; i < slDate.Count; i++)
{
Console.WriteLine("{0}", slDate[i].ToString());
}

Date.cs(基类):

    //Constructor
public Date(int d, int m, int j)
{
// .....
}


public virtual int CompareTo(Date d)
{
int res;

res = this.Year.CompareTo(d.Year); //Year is a property
if (res != 0) return res;

res = this.Month.CompareTo(d.Month);
if (res != 0) return res;

res = this.Day.CompareTo(d.Day);
if (res != 0) return res;

return 0;
}

}/*Date*/

DateTime.cs(派生类):

    //Constructor
public DateTime(int d, int m, int j, int h, int min): base(d, m, j)
{
//....
}

class DateTime: Date //derived class
{
//code ....

public override int CompareTo(Date d)
{
DateTime dt = (DateTime)d;
int res;

res = this.Hours.CompareTo(dt.Hours);
if (res != 0) return res;

res = this.Minutes.CompareTo(dt.Minutes);
if (res != 0) return res;

return 0;
}

}

最佳答案

首先,基类需要实现IComparable。
其次,您的子类试图将 Date 转换为 DateTime(并非总是如此)。

public override int CompareTo(object obj) 
{
var comparison = base.CompareTo(obj);
if(comparison == 0 && obj is DateTime)
{
DateTime dt = (DateTime)obj;
int res;

res = this.Hours.CompareTo(dt.Hours);
if (res != 0) return res;

res = this.Minutes.CompareTo(dt.Minutes);
if (res != 0) return res;

return 0;
}
return comparison;
}

因此,我们执行基类的比较。如果它确定它们相等,并且我们正在处理日期时间,那么我们需要进一步比较。否则,只返回基值

评论的多态性示例:

 public int DoCompare(Date firstDate, Date secondDate)
{
int res;

res = firstDate.Year.CompareTo(secondDate.Year); //Year is a property
if (res != 0) return res;

res = firstDate.Month.CompareTo(secondDate.Month);
if (res != 0) return res;

res = firstDate.Day.CompareTo(secondDate.Day);
if (res != 0) return res;

return 0;
}

我们可以像这样使用这个函数:

var test = DoCompare(new DateTime(8,11,2011,20,30), new Date(1, 2, 2011));

请注意,我们刚刚传入了一个 DateTime,函数采用了一个 Date。我们可以这样做,因为我们保证 DateTime 将拥有 Date 拥有的所有功能和属性(以及更多......但现在我们不关心额外的功能)。

现在看看这个函数:

public int DoCompareDateTimes(DateTime firstDate, DateTime secondDate)
{
int res;

res = firstDate.Year.CompareTo(secondDate.Year); //Year is a property
if (res != 0) return res;

res = firstDate.Month.CompareTo(secondDate.Month);
if (res != 0) return res;

res = firstDate.Day.CompareTo(secondDate.Day);
if (res != 0) return res;

res = this.Hours.CompareTo(dt.Hours);
if (res != 0) return res;

res = this.Minutes.CompareTo(dt.Minutes);
if (res != 0) return res;

return 0;
}

var test = DoCompareDateTimes(new DateTime(8,11,2011,20,30), new Date(1, 2, 2011));

我们不能这样做。该函数需要一个 DateTime 对象,但我们传入了一个 Date(不能转换为 DateTime,因为 DateTime 具有 Date 没有的功能)

关于c# - 无法比较数组中的 2 个对象(与继承和泛型比较),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4722965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com