使用 IComparable 比较对象时出现问题
本文关键字:问题 对象 IComparable 比较 使用 | 更新日期: 2023-09-27 18:32:16
这是我正在尝试工作的一些代码。如果一个集中的项目与另一个集中的项目不匹配,则会将 0 添加到所有比较项目的列表中。如果最终列表不包含除 0 以外的任何其他值,则意味着第一组中的项目在第二集中根本不存在。由于某种原因,我在结果列表中不断得到错误的值,所以某处一定有一个错误,只是我似乎找不到它。
public class CompareItem : IComparable
{
public string CustId { get; set; }
public string TechId { get; set; }
public CompareItem(string custId, string techId)
{
CustId = custId;
TechId = techId;
}
public int CompareTo(object obj)
{
CompareItem Temp = (CompareItem)obj;
if (this.CustId != Temp.CustId || this.TechId != Temp.TechId)
{
return 0;
}
else
{
return 1;
}
}
}
static void Main(string[] args)
{
List<CompareItem> LeftCompareSet = new List<CompareItem>();
LeftCompareSet1.Add(new CompareItem("0000", "0001"));
LeftCompareSet1.Add(new CompareItem("0001", "0001"));
LeftCompareSet1.Add(new CompareItem("0002", "0002"));
LeftCompareSet1.Add(new CompareItem("0003", "0003"));
LeftCompareSet1.Add(new CompareItem("0002", "0004"));
List<CompareItem> RightCompareSet = new List<CompareItem>();
RightCompareSet1.Add(new CompareItem("0005", "0005"));
RightCompareSet1.Add(new CompareItem("0004", "0004"));
RightCompareSet1.Add(new CompareItem("0003", "0003"));
RightCompareSet1.Add(new CompareItem("0002", "0002"));
RightCompareSet1.Add(new CompareItem("0006", "0002"));
int state = 0;
List<int> tlc = new List<int>();
List<int> trc = new List<int>();
foreach (CompareItem lc in LeftCompareSet)
{
foreach (CompareItem rc in RightCompareSet)
{
state = lc.CompareTo(rc);
if (state == 0)
{
tlc.Add(0);
}
else
{
tlc.Add(1);
}
}
if (tlc.Contains(1))
{
Console.WriteLine("Cust: " + lc.CustId + ", Tech: " + lc.TechId + ", Not missing");
}
else
{
Console.WriteLine("Cust: " + lc.CustId + ", Tech: " + lc.TechId + ", Missing");
}
}
foreach (CompareItem rc in RightCompareSet)
{
foreach (CompareItem lc in LeftCompareSet)
{
state = rc.CompareTo(lc);
if (state == 0)
{
trc.Add(0);
}
else
{
trc.Add(1);
}
}
if (trc.Contains(1))
{
Console.WriteLine("Cust: " + rc.CustId + ", Tech: " + rc.TechId + ", Not missing");
}
else
{
Console.WriteLine("Cust: " + rc.CustId + ", Tech: " + rc.TechId + ", Missing");
}
}
}
你的CompareTo
错了。它应该返回 0 表示两个对象相同,如果一个对象小于另一个对象,则返回 -1,如果它更大,则返回 1。看这里
我认为这种方法有几个问题:
-
代码包含一个小错误:它必须是LeftCompareSet 而不是 LeftCompareSet1
-
在 CompareTo 中,您错过了检查对象的类型,如果使用错误的对象调用该方法,则会出现异常。
-
我认为您真正需要的是实现 Equals 方法:公共覆盖布尔值等于(对象对象)(不要忘记GetHashCode)
-
不确定你真正想要实现什么,可能设定操作更有帮助
-
你没有写结果有什么问题,如果我执行你的代码,我会得到以下结果:
- 客户: 0000,
- 技术: 0001, 缺失 客户: 0001
- , 技术: 0001, 缺失 客户:0002,
- 技术:0002,不缺失 客户:0003,
- 技术:0003,不缺失 客户: 0002,
- 技术: 0004, 不缺少 客户: 0005
- , 技术: 0005, 缺失
您只想确认第一个列表中的项目是存在于第二个列表中?
如果我是对的,那么你已经走了很长的路。只需从一个列表中取出一个项目并检查它是否存在于第二个列表中
例:
secondList.Exists(first[0]);
它将返回布尔值。