我有两个相同类的列表,并希望生成两个列表中出现的对象计数。
Dim repeatingMentions As Integer
repeatingMentions =currentMentions.Where(Function(m) previousMentions.Contains(m)).Count
调试我可以看到这两个列表包含具有完全相同属性值的对象,这足以满足包含因为计数返回为0。
答案 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)