2014-10-07 1 views
1

У меня есть два списка одного и того же класса, и вы хотите сгенерировать количество объектов, отображаемых в обоих списках.Сравнение двух списков для получения объектов, отображаемых как в

Dim repeatingMentions As Integer 
repeatingMentions =currentMentions.Where(Function(m) previousMentions.Contains(m)).Count 

Debugging я могу видеть, что эти два списка содержат объекты с точно такими же значениями свойств, этого достаточно, чтобы удовлетворить содержит, потому что граф возвращается как 0.

ответ

2

Вам необходимо переопределить Equals + GetHashCode или задать персональный код IEqualityComparer(Of YourClassName), чтобы сделать эту работу Contains. Или вы должны использовать Any:

repeatingMentions = currentMentions. 
    Count(Function(m) previousMentions. 
     Any(Function(p) m.PropertyName = p.PropertyName)) 

или вы могли бы присоединиться оба списка с помощью Enumerable.Join:

Dim inBoth = From currMent In currentMentions 
      Join prevMent In previousMentions 
      On currMent.PropertyName Equals prevMent.PropertyName 
repeatingMentions = inBoth.Count() 
+0

Спасибо, согласился, так как это отвечает на исходный вопрос и имеет альтернативные решения. – DavidB

1

Используйте Intersect метод из Linq найти пересечение в двух последовательностях, затем вызовите метод Count, чтобы подсчитать его.

repeatingMentions = currentMentions.Intersect(previousMentions).Count() 

Обратите внимание, что метод выше сравнивает экземпляры по ссылкам по умолчанию. Если вам нужна специальная реализация, вам нужно использовать this overload of Intersect, который принимает в качестве параметра IEqualityComparer.

+0

Это не будет работать, как класс, кажется, не переопределить 'Equals' +' GetHashCode' (_ "содержать объекты с точно такими же значениями свойств, ... count возвращается как 0." _) –

+0

@TimSchmelter Я обновлял свой ответ, добавил оговорку об этом. –

+0

Большое спасибо, конечно, ссылки будут разными, поэтому счет будет правильным. Я собираюсь добавить свой собственный сравнитель и посмотреть, как это работает – DavidB

0

Пусть a() и b() два целочисленных массива, вы можете выбрать количество общих элементов как используя приведенный ниже код. как и в случае строковых массивов.

Dim a As Integer() = {1, 5, 2, 3, 6, 4, 7, 89, 5, 8} 
    Dim b As Integer() = {4, 78, 85, 2, 2, 3, 1, 4, 8} 
    Dim count As Integer = a.Intersect(b).Count 
0

Вы можете использовать метод расширения Intersect для этого. (Вы, возможно, придется ссылаться на него путем ссылки на пространство имен System.Linq)

Пример с списком строк.

List<string> a = new List<string>(); 
List<string> b = new List<string>(); 

var result = a.Intersect(b); 

В зависимости от вашего объекта, вы должны реализовать IEqualityComparer и передать его методу пересекаются правильно сравнивать объект (орудия Равно и getHash)