2016-12-10 1 views
3

Cela fait longtemps que j'écris une seule ligne de code alors, s'il vous plaît, soyez patient si je pose une question stupide.C#: 'IEnumerable <Student>' ne contient pas de définition de 'Intersect'

Même si l'IntelliSense affiche la méthode Intersection après Noms, j'obtiens l'erreur suivante lorsque j'essaie de comparer deux IEnumerables. J'essaie de comparer le résultat d'une requête de base de données à une liste ordonnée dans le code HTML.

'IEnumerable' ne contient pas une définition pour 'Intersection' et la meilleure méthode extension de surcharge 'Queryable.Intersect (IQueryable, IEnumerable)' nécessite un récepteur de type 'IQueryable'

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

Je me demande ce que je fais mal. Toute aide est la bienvenue. Merci.

A la fin du code ressemble à ceci:

IEnumerable<string> Names = GetData(CardNumber, Section).Select(s => s.FullName); 
    IEnumerable<string> OrderedList = driver.FindElements(By.XPath("//li[@ng-repeat='Names']")).Select(i => i.Text); 

Merci, beaucoup pour votre aide.

+0

Comment supposez-vous qu'il se croiserait entre 'Students' et' IWebElements'? Vous pourriez avoir un problème différent en plus de cela, mais c'est en effet quelque chose que vous devriez probablement prendre en charge. – SimpleVar

Répondre

4

C'est parce que Intersect exige que les deux collections soient du même type. Vous essayez de l'appeler avec une collection ou Student et la collection de IWebElement.

Assurez-vous d'avoir deux collections du même type avant d'appeler le Intersect ou d'utiliser une méthode différente pour réaliser votre tâche.

Vous pouvez projet à la fois la collecte en quelque chose qui peut être facilement comparé (par exemple IEnumerable<string>):

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

Ou vous pourriez probablement utiliser All de le faire:

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

Je ne connaître les propriétés que vous souhaitez comparer, remplacez donc le prédicat par quelque chose de logique.

+0

A travaillé comme un charme. Je vous remercie! – frankztein