猿教程 Logo

Linq量词运算符:Contains

Contains运算符检查集合中是否存在指定的元素,并返回布尔值。

Contains()扩展方法具有以下两个重载。 第一个重载方法需要一个值来检查集合,第二个重载方法需要IEqualityComparer类型的附加参数来进行自定义均衡比较。

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()扩展方法需要一个值来检查作为输入参数。 值的类型必须与通用集合的类型相同。 以下包含的示例检查集合中是否存在10。 请注意,int是一种类型的通用集合。

相关实例:

IList<int> intList = new List<int>() { 1, 2, 3, 4, 5 };
bool result = intList.Contains(10); // returns false

VB相关实例:

Dim intList As IList(Of Integer) = New List(Of Integer) From {1, 2, 3, 4, 5}
Dim result = intList.Contains(10) ' returns false

上面的例子适用于原始数据类型。 但是,它不会与自定义类一起使用。 请查参考以下示例:

相关实例:

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,即使“Bill”存在于studentList中。 这是因为Contains扩展方法仅比较对象的引用,而不是对象的实际值。 因此,要比较student对象的值,您需要通过实现IEqualityComparer接口创建一个类,该接口比较两个Student对象的值并返回boolean。

以下是一个StudentComparer类,它实现了IEqualityComparer <Student>接口来比较两个学生对象的值:

相关实例:

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();
        }
}

现在,您可以在接受IEqualityComparer类型的第二个参数的Contains扩展方法的第二个重载方法中使用上面的StudentComparer类,如下所示:

相关实例:

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扩展方法为自定义类获得正确的结果。

以下是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
注意

量词运算符不支持查询语法,只支持方法语法。

要点
  1. All,Any和Contains在LINQ中的量词运算符。 

  2. All检查序列中的所有元素是否满足指定条件。 

  3. Any检查序列中的任何元素是否满足指定条件

  4. Contains运算符检查集合中是否存在指定的元素。 

  5. 使用导出带有Contains的IEqualityOperator的自定义类来检查集合中的对象。 

  6. 在C#或VB.Net中的查询语法中不支持All,Any和Contains


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-quantifier-operator-contains.html