比较2个列表并使用不同的项目创建新列表

时间:2013-12-04 16:10:36

标签: c# .net list .net-2.0

我有两个列表,我正在尝试比较。我需要完成的工作主要是删除两个列表之间重复的项目,只保留不同的对象。现在,我正在将非重复数据插入新列表中。

我在这里使用的数据......

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。那么有什么其他方法可以让我失去这项工作吗?或者有更好的方法吗?我无法找到任何东西(可能只是看起来不够努力)来完成我想要做的事情。

提前致谢!

3 个答案:

答案 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;
}