2013-09-17 5 views
0

У меня есть объект, который выглядит следующим образом:Сравнить два ИНТ список

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")); 

Тогда у меня есть несколько списков целые числа, как так:

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); 

То, что я хотел бы сделать это, чтобы быть в состоянии проверить эти целые списки со списком TestObject и е xtract TestObjects, которые равны. Другими словами, в этом примере list1 найдет попадание в объект в позиции 0, list4 найдет хит в позиции 2, нет никакого удара для list3, поскольку в позиции 4 есть только частичное, и нет никакого списка для списка2 так как его не существует.

Сначала я подумал, что это можно сделать с помощью «За исключением». Итак, если между спискомN и listTest нет ничего, кроме n, то это хит? Дело в том, как сравнить listN со списком в объекте в позиции N в listTest ??

+0

Как об использовании оператор равенства класса списка для проверки равенства? – clearwater

+1

@Clearwater: Это проверяет на * ссылочное равенство *, а не * значение равенства *. –

+0

Спасибо, ребята. Да, я уже пробовал это, и Эрик прав. Он не работает, поскольку он проверяет только на ссылочное равенство. SequenceEqual тоже не работал. –

ответ

5

Если вы заботитесь о порядке элементов в списке, то spender's решение является хорошим.

Однако, если порядок элементов не имеет значения (например, {5, 1, 0} должен соответствовать {0, 1, 5}), вы могли бы использовать что-то вроде этого:

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)); 
+1

+1 - Я до сих пор не знал о 'SetEquals'. – DaveShaw

+0

да, последовательность не имеет значения. Я попробую это. –

+0

Удивительный! Благодаря! Это сработало! –

Смежные вопросы