我有两个列表,我正在尝试比较。我需要完成的工作主要是删除两个列表之间重复的项目,只保留不同的对象。现在,我正在将非重复数据插入新列表中。
我在这里使用的数据......
LIST1 ( “B”,2) ( “C”,3)
列表2 ( “A”,1) ( “B”,2) ( “C”,3) ( “d”,4)
NEWLIST ( “A”,1) ( “d”,4)
这是我到目前为止所拥有的......
我的对象:
public class TestClass
{
protected string teststring;
protected int testint;
public string TestString
{
get { return teststring; }
set { teststring = value; }
}
public int TestInt
{
get { return testint; }
set { testint = value; }
}
public TestClass() { }
}
我的比较逻辑:
private static List<TestClass> CompareCodes(List<TestClass> list1, List<TestClass> list2)
{
List<TestClass> newList = new List<TestClass>();
foreach (TestClass s in list2)
{
if (list1.Contains(s) == false)
{
newList.Add(s);
}
}
if (newList.Count != 0)
return newList;
else
return null;
}
新列表将用于将数据插入数据库表。如果为null,则不执行任何操作。我在这个应用程序中使用.NET 2.0(它是对旧应用程序的增强),所以我不能使用LINQ。那么有什么其他方法可以让我失去这项工作吗?或者有更好的方法吗?我无法找到任何东西(可能只是看起来不够努力)来完成我想要做的事情。
提前致谢!
答案 0 :(得分:3)
所以你几乎就在那里,但是你需要覆盖你班级的Equals
方法才能让它发挥作用:
public class TestClass
{
public override bool Equals(object y)
{
TestClass newY = y as TestClass;
if (newY == null) { return false; }
return newY.TestString == this.TestString &&
newY.TestInt == this.TestInt;
}
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + this.TestInt.GetHashCode();
hash = hash * 23 + this.TestString == null ?
0 :
this.TestString.GetHashCode();
return hash;
}
}
}
使用Jon Skeet's answer here来实现哈希码。
答案 1 :(得分:3)
在您提供的代码中,您只保留 list1 中不在 list1 中的项目。但 list1 中的项目如何但 list2 中没有?既然你提到了
我需要完成的工作主要是删除两个列表之间重复的项目,只保留不同的对象
以下代码返回一个新列表,其中包含两个列表中唯一的项目
private static List<TestClass> CompareCodes(List<TestClass> list1, List<TestClass> list2)
{
List<TestClass> newList ;
newList = new List<TestClass>();
//All the items in list1 that are not in list2 are added
foreach (TestClass s in list1)
{
if ( ! list2.Contains(s))
{
newList.Add(s);
}
}
//All the items in list2 that are not in list1 are added
foreach (TestClass s in list2)
{
if ( ! list1.Contains(s))
{
newList.Add(s);
}
}
return newList;
}
在你的课堂上
public class TestClass implements IEquatable
{
protected string teststring;
protected int testint;
public string TestString
{
get { return teststring; }
set { teststring = value; }
}
public int TestInt
{
get { return testint; }
set { testint = value; }
}
public override bool Equals(object y)
{
TestClass newY = y as TestClass;
if (newY == null) { return false; }
return newY.TestString == this.TestString &&
newY.TestInt == this.TestInt;
}
public override int GetHashCode()
{
// use this example or implement some hash code logic
return this.TestInt.GetHashCode() ;
}
public TestClass() { }
}
答案 2 :(得分:0)
private static List<TestClass> CompareCodes(List<TestClass> list1,
List<TestClass> list2)
{
List<TestClass> newList = new List<TestClass>();
bool found = false;
foreach (TestClass s in list2)
{
foreach (TestClass t in list1)
{
//let's say that teststring is your object id / key
if(s.TestString==t.TestString )
{
found = true;
break;
}
}
if(!found)
newList.Add(s);
found=false;
}
// do the something for the List1
foreach (TestClass s in list1)
{
foreach (TestClass t in list2)
{
//let's say that teststring is your object id / key
if(s.TestString==t.TestString )
{
found = true;
break;
}
}
if(!found)
newList.Add(s);
found=false;
}
if (newList != null)
return newList;
else
return null;
}