比较两个列表以获取两者中出现的对象

时间:2014-10-07 11:03:19

标签: .net vb.net linq

我有两个相同类的列表,并希望生成两个列表中出现的对象计数。

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

调试我可以看到这两个列表包含具有完全相同属性值的对象,这足以满足包含因为计数返回为0。

4 个答案:

答案 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()

答案 1 :(得分:1)

使用Linq的Intersect方法查找两个序列中的交集,然后调用Count方法对其进行计数。

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

请注意,上面的方法默认情况下通过引用比较实例。如果您想要自定义实现,则需要使用this overload of Intersect作为参数。{/ p>

答案 2 :(得分: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

答案 3 :(得分:0)

您可以使用交叉扩展方法。(您可能必须通过引用命名空间System.Linq来引用它)

带有字符串列表的示例。

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

var result =  a.Intersect(b);

根据您的对象,您应该实现IEqualityComparer并将其传递给intersect方法以正确比较对象(实现Equals和getHash)