首先,我必须说我不是一个经验丰富的程序员。我在StackOverflow上查看了类似的问题,但似乎没有找到一个合适的答案,我可以用我有限的技能来实现。
在C#中,我需要根据这些对象中一个或多个属性的值来比较两个对象列表。我想创建两个新列表,一个是左边存在的对象,但是在一些属性值中存在差异,或者在右侧列表中根本不存在,反之亦然。
在我只需要根据一个值比较两个值之前,所以我不需要处理对象而是使用字符串,所以我做了类似的事情:
(LeftItems and RightItems are Entities)
List<String> leftList = new List<string>();
List<String> rightList = new List<string>();
List<String> leftResultList = new List<string>();
List<String> rightResultList = new List<string>();
List<String> leftResultObjList = new List<string>();
List<String> rightResultObjList = new List<string>();
foreach (item i in leftItems)
{
leftlist.Add(i.value);
}
//same for right
foreach (string i in leftList)
{
if(!rightList.contains(i))
{
leftResultList.Add(i);
}
}
//same for the right list
现在我必须比较多个值,所以我创建了一个具有几个属性的类,我需要比较,所以我想做与上面相同的事情,但是使用对象属性:
class CompItems
{
string _x;
string _y;
public CompItems(string x, string y)
{
_x = x;
_y = y;
}
}
foreach (item i in leftItems)
{
leftList.Add(new CompItem(i.value1,i.value2));
}
//same for the right list
foreach (CompItem c in leftItems)
{
// Here is where things go wrong
if(one property of object in rightItems equals property of object in leftItems) && some other comparisons
{
resultLeftObjList.Add(c)
}
}
//And the same for the right list
答案 0 :(得分:6)
您可以让您的类继承自IComparable并根据您想要的属性进行比较,如下所示:
class Employee : IComparable
{
private string name;
public string Name
{
get { return name; }
set { name = value ; }
}
public Employee( string a_name)
{
name = a_name;
}
#region IComparable Members
public int CompareTo( object obj)
{
Employee temp = (Employee)obj;
if ( this.name.Length < temp.name.Length)
return -1;
else return 0;
}
}
您可以找到此解决方案的详细信息here
答案 1 :(得分:4)
在这种情况下,最简单和最OOP的方法imo可能是一个简单的实现
IComparable Interface对您的两种类型,并在简单地调用CompareTo
之后。
希望这有帮助。
答案 2 :(得分:2)
例如覆盖
public Coordinates(string x, string y)
{
X = x;
Y = y;
}
public string X { get; private set; }
public string Y { get; private set; }
public override bool Equals(object obj)
{
if (!(obj is Coordinates))
{
return false;
}
Coordinates coordinates = (Coordinates)obj;
return ((coordinates.X == this.X) && (coordinates.Y == this.Y));
}
然后调用'Equal'列表