2016-12-10 4 views
3

Я уже давно написал одну строку кода, поэтому, пожалуйста, будьте терпеливы, если я задаю тупой вопрос.C#: 'IEnumerable <Student>' не содержит определения для 'Intersect'

Несмотря на то, что IntelliSense показывает метод Intersect после имен, я получаю следующую ошибку при попытке сравнить два IEnumerables.

Я пытаюсь сравнить результат запроса базы данных по сравнению с упорядоченным списком в html.

'IEnumerable' не содержит определение для 'Intersect' и лучший метод расширения перегрузки 'Queryable.Intersect (IQueryable, IEnumerable)' требует приемник типа '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; } 

Интересно, что я делаю неправильно. Любая помощь будет оценена. Благодарю.

В конце код выглядит следующим образом:

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

Спасибо большое за вашу помощь.

+0

Как вы думаете, это будет пересекаться между 'Students' и' IWebElements'? У вас может быть другая проблема, но это действительно то, о чем вы, вероятно, должны позаботиться. – SimpleVar

ответ

4

Это потому, что 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))) 

Я не знайте, какие свойства вы хотите сравнить, поэтому замените предикат тем, что имеет смысл.

+0

Работал как шарм. Спасибо! – frankztein

Смежные вопросы