C#:'IEnumerable <student>'不包含'Intersect'的定义

时间:2016-12-10 02:56:00

标签: c# linq ienumerable generic-collections

我写了一行代码已经很久了,所以,如果我问一个愚蠢的问题,请耐心等待。

尽管IntelliSense在Names之后显示了Intersect方法,但在尝试比较两个IEnumerables时出现以下错误。

我试图将数据库查询的结果与html中的有序列表进行比较。

  

'IEnumerable'不包含'Intersect'的定义和最佳扩展方法重载   “Queryable.Intersect(IQueryable的,   IEnumerable)'需要一个类型的接收器   'IQueryable的'

distinctUntilChanged

我想知道我做错了什么。任何帮助将不胜感激。感谢。

最后代码如下:

namespace Data.Repositories
{
    public class StudentsRepository
    {
        public class Student
        { 
            public string FullName { get; set; }
        }

        public static IEnumerable<Student> GetData(string CardNumber, string Section)
        {
            // FullName varchar(300) in Database
            return CommonFunctions.ExecuteReader1<Student>(QryStudentSectionDetails(CardNumber, Section)).AsQueryable();
        }
    }
}


namespace Tests.ActionsLibrary.StudentPaper
{
    public class StudentActions:TestBase
    {
        bool IsMatch = false;

        // Get Names from DataBase
        IEnumerable<Student> Names = GetData(CardNumber, Section);

        // Get Names from Ordered list in HTML
        IEnumerable<IWebElement> OrderedList = driver.FindElements(By.XPath("//li[@ng-repeat='Names']"));

        if (Names.Count() == OrderedList.Count() && Names.Intersect(OrderedList).Count() == OrderedList.Count()) // The error is shown here.
        { IsMatch = true; }

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:10)

那是因为Intersect要求两个集合属于同一类型。您尝试使用集合或Student以及IWebElement的集合来调用它。

在调用Intersect或使用其他方法完成任务之前,请确保您有两个相同类型的集合。

您可以将两个集合投射到可以轻松比较的内容(例如IEnumerable<string>):

var studentNames = Names.Select(student => student.Name);
var webElementNames = OrderedList.Select(webElement => webElement.Name);

或者您可以使用All来执行此操作:

if(Names.All(student => OrderedList.Any(webElement => webElement.Name == student.Name)))

我不知道你要比较哪些属性,所以用有意义的东西替换谓词。