C# 比较两个整型列表

C# 比较两个整型列表,c#,linq,list,int,C#,Linq,List,Int,我有一个像这样的对象: public class TestObject { private string name = string.Empty; private List<int> ids; public TestObject(List<int> ids, string name) { this.ids = ids; this.name = name;

我有一个像这样的对象:

public class TestObject {

        private string name = string.Empty;
        private List<int> ids;

        public TestObject(List<int> ids, string name)
        {
            this.ids = ids;
            this.name = name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public List<int> Ids
        {
            get { return ids; }
            set { ids = value; }
        }

    }
List<TestObject> listTest = new List<TestObject>();
listTest.Add(new TestObject((new int[] { 0, 1, 5 }).ToList(), "Test1"));
listTest.Add(new TestObject((new int[] { 10, 35, 15 }).ToList(), "Test2"));
listTest.Add(new TestObject((new int[] { 55 }).ToList(), "Test3"));
listTest.Add(new TestObject((new int[] { 44 }).ToList(), "Test4"));
listTest.Add(new TestObject((new int[] { 7, 17  }).ToList(), "Test5"));
listTest.Where(t => t.Ids.Count == list4.Count && !t.Ids.Except(list4).Any());
公共类TestObject{
私有字符串名称=string.Empty;
私有列表ID;
公共测试对象(列表ID、字符串名称)
{
this.ids=ids;
this.name=名称;
}
公共字符串名
{
获取{返回名称;}
设置{name=value;}
}
公共列表ID
{
获取{返回ID;}
设置{ids=value;}
}
}
我得到了这些对象的列表,如下所示:

public class TestObject {

        private string name = string.Empty;
        private List<int> ids;

        public TestObject(List<int> ids, string name)
        {
            this.ids = ids;
            this.name = name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public List<int> Ids
        {
            get { return ids; }
            set { ids = value; }
        }

    }
List<TestObject> listTest = new List<TestObject>();
listTest.Add(new TestObject((new int[] { 0, 1, 5 }).ToList(), "Test1"));
listTest.Add(new TestObject((new int[] { 10, 35, 15 }).ToList(), "Test2"));
listTest.Add(new TestObject((new int[] { 55 }).ToList(), "Test3"));
listTest.Add(new TestObject((new int[] { 44 }).ToList(), "Test4"));
listTest.Add(new TestObject((new int[] { 7, 17  }).ToList(), "Test5"));
listTest.Where(t => t.Ids.Count == list4.Count && !t.Ids.Except(list4).Any());
List listest=new List();
Add(newtestobject((newint[]{0,1,5}).ToList(),“Test1”);
Add(newtestobject((newint[]{10,35,15}).ToList(),“Test2”);
Add(newtestobject((newint[]{55}).ToList(),“Test3”);
Add(newtestobject((newint[]{44}).ToList(),“Test4”);
Add(newtestobject((newint[]{7,17}).ToList(),“Test5”);
然后我有几个整数列表,如下所示:

List<int> list1 = new List<int>();
list1.Add(0);
list1.Add(1);
list1.Add(5);

List<int> list2 = new List<int>();
list2.Add(4);


List<int> list3 = new List<int>();
list3.Add(7);

List<int> list4 = new List<int>();
list4.Add(55);
List list1=新列表();
列表1.添加(0);
清单1.添加(1);
清单1.添加(5);
List list2=新列表();
清单2.添加(4);
List list3=新列表();
清单3.添加(7);
List list4=新列表();
清单4.添加(55);
我想做的是能够对照TestObject列表检查这些整数列表,并提取相等的TestObject。换句话说,在本例中,list1将在位置0的对象中找到命中,list4将在位置2找到命中,list3没有命中,因为位置4中只有部分命中,list2没有命中,因为它不存在


首先,我认为它可以用“除外”来完成。所以,如果listN和listTest在n位置之间没有任何区别,那么这就是一个成功的例子??问题是如何将listN与listTest中位于N位置的对象中的列表进行比较???

如果您关心列表中项目的顺序,那么解决方案是一个很好的方案

listTest.Where(lt => lt.Ids.SequenceEqual(someOtherList))
但是,如果项目的顺序无关紧要(例如,
{5,1,0}
应与
{0,1,5}
匹配),则可以使用如下内容:

public class TestObject {

        private string name = string.Empty;
        private List<int> ids;

        public TestObject(List<int> ids, string name)
        {
            this.ids = ids;
            this.name = name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public List<int> Ids
        {
            get { return ids; }
            set { ids = value; }
        }

    }
List<TestObject> listTest = new List<TestObject>();
listTest.Add(new TestObject((new int[] { 0, 1, 5 }).ToList(), "Test1"));
listTest.Add(new TestObject((new int[] { 10, 35, 15 }).ToList(), "Test2"));
listTest.Add(new TestObject((new int[] { 55 }).ToList(), "Test3"));
listTest.Add(new TestObject((new int[] { 44 }).ToList(), "Test4"));
listTest.Add(new TestObject((new int[] { 7, 17  }).ToList(), "Test5"));
listTest.Where(t => t.Ids.Count == list4.Count && !t.Ids.Except(list4).Any());
或者更好:

var list4Hash = new HashSet(list4);
listTest.Where(t => list4Hash.SetEquals(t.Ids));

如果您关心列表中项目的顺序,那么解决方案就是一个好的解决方案

但是,如果项目的顺序无关紧要(例如,
{5,1,0}
应与
{0,1,5}
匹配),则可以使用如下内容:

public class TestObject {

        private string name = string.Empty;
        private List<int> ids;

        public TestObject(List<int> ids, string name)
        {
            this.ids = ids;
            this.name = name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public List<int> Ids
        {
            get { return ids; }
            set { ids = value; }
        }

    }
List<TestObject> listTest = new List<TestObject>();
listTest.Add(new TestObject((new int[] { 0, 1, 5 }).ToList(), "Test1"));
listTest.Add(new TestObject((new int[] { 10, 35, 15 }).ToList(), "Test2"));
listTest.Add(new TestObject((new int[] { 55 }).ToList(), "Test3"));
listTest.Add(new TestObject((new int[] { 44 }).ToList(), "Test4"));
listTest.Add(new TestObject((new int[] { 7, 17  }).ToList(), "Test5"));
listTest.Where(t => t.Ids.Count == list4.Count && !t.Ids.Except(list4).Any());
或者更好:

var list4Hash = new HashSet(list4);
listTest.Where(t => list4Hash.SetEquals(t.Ids));

使用list类的equals运算符来测试相等性如何?@Clearwater:这是检查引用相等性,而不是值相等性。谢谢大家。是的,我已经试过了,埃里克是对的。它不起作用,因为它只检查引用的相等性。SequenceEqual也不起作用。使用list类的equals运算符测试相等性如何?@Clearwater:这检查引用相等性,而不是值相等性。谢谢大家。是的,我已经试过了,埃里克是对的。它不起作用,因为它只检查引用的相等性。SequenceEqual也不起作用。