Contains運算符檢查集合中是否存在指定的元素,并返回布爾值。
Contains()擴展方法有以下兩個重載。第一個重載方法需要一個值來檢入集合,第二個重載方法需要使用IEqualityComparer類型的附加參數(shù)來進行自定義相等性比較。
Contains() 重載:
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value); public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer);
如上所述,Contains()擴展方法需要一個值作為輸入?yún)?shù)進行檢查。值的類型必須與泛型集合的類型相同。下面的示例包含檢查集合中是否存在10。請注意,int是泛型集合的一種類型。
IList<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
bool result = intList.Contains(10); // 返回 falseDim intList As IList(Of Integer) = New List(Of Integer) From {1, 2, 3, 4, 5}
Dim result = intList.Contains(10) '返回 false上面的示例適用于原始數(shù)據(jù)類型。但是,它不適用于自定義類。看以下示例:
IList<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
new Student() { StudentID = 2, StudentName = "Steve", Age = 15 } ,
new Student() { StudentID = 3, StudentName = "Bill", Age = 25 } ,
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 }
};
Student std = new Student(){ StudentID =3, StudentName = "Bill"};
bool result = studentList.Contains(std); //returns false正如您在上面的示例中看到的,Contains返回false,即使studentList中存在“Bill”。這是因為Contains擴展方法只比較對象的引用,而不比較對象的實際值。所以要比較student對象的值,需要通過實現(xiàn)IEqualityComparer接口創(chuàng)建一個類,該接口比較兩個student對象的值并返回boolean。
以下是StudentComparer類,它實現(xiàn)IEqualityComparer<Student>接口來比較兩個Students對象的值:
class StudentComparer : IEqualityComparer<Student>
{
public bool Equals(Student x, Student y)
{
if (x.StudentID == y.StudentID &&
x.StudentName.ToLower() == y.StudentName.ToLower())
return true;
return false;
}
public int GetHashCode(Student obj)
{
return obj.GetHashCode();
}
}現(xiàn)在,你可以在Contains擴展方法的第二個重載方法中使用上面的StudentComparer類,該方法接受第二個參數(shù)為IEqualityComparer類型,如下所示:
示例: c # 中 Contains 與 Comparer 類
IList<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
new Student() { StudentID = 2, StudentName = "Steve", Age = 15 } ,
new Student() { StudentID = 3, StudentName = "Bill", Age = 25 } ,
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 }
};
Student std = new Student(){ StudentID =3, StudentName = "Bill"};
bool result = studentList.Contains(std, new StudentComparer()); //returns true因此,必須使用Comparer類才能從自定義類的Contains擴展方法中獲得正確的結(jié)果。
下面是 VB.Net 中的一個類似的實例:
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int Age { get; set; }
}
Public Class StudentComparer Implements IEqualityComparer(Of Student)
Public Function Equals1(x As Student, y As Student) As Boolean Implements IEqualityComparer(Of Student).Equals
If (x.StudentID = y.StudentID And x.StudentName.ToLower() = y.StudentName.ToLower()) Then
Return True
End If
Return False
End Function
Public Function GetHashCode1(obj As Student) As Integer Implements IEqualityComparer(Of Student).GetHashCode
Return obj.GetHashCode()
End Function
End Class
Sub Main
Dim studentList = New List(Of Student) From {
New Student() With {.StudentID = 1, .StudentName = "John", .Age = 18},
New Student() With {.StudentID = 2, .StudentName = "Steve", .Age = 15},
New Student() With {.StudentID = 3, .StudentName = "Bill", .Age = 25},
New Student() With {.StudentID = 4, .StudentName = "Ram", .Age = 20},
New Student() With {.StudentID = 5, .StudentName = "Ron", .Age = 19}
}
Dim std As New Student With {.StudentID = 3, .StudentName = "Bill"}
Dim result = studentList.Contains(std, New StudentComparer()) ' returns true
End Sub在C#或VB.Net中,不支持限定符運算符。
All, Any & Contains是LINQ中的限定運算符。
All檢查序列中的所有元素是否滿足指定條件。
檢查序列中是否有任何元素滿足指定條件
Contains 操作符檢查指定的元素是否存在于集合中。
使用派生 IEqualityOperator 和 Contains 的自定義類檢查集合中的對象。
在C#或VB.Net的查詢語法中不支持All, Any & Contains。
下一步了解聚合運算符。