亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

LINQ 限定運算符 Contains

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);  // 返回 false
Dim 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中,不支持限定符運算符。

注意事項

  1. All, Any & Contains是LINQ中的限定運算符。

  2. All檢查序列中的所有元素是否滿足指定條件。

  3. 檢查序列中是否有任何元素滿足指定條件

  4. Contains 操作符檢查指定的元素是否存在于集合中。

  5. 使用派生 IEqualityOperator 和 Contains 的自定義類檢查集合中的對象。

  6. 在C#或VB.Net的查詢語法中不支持All, Any & Contains。

下一步了解聚合運算符。