web-dev-qa-db-ja.com

C#: 'IEnumerable <Student>'に 'Intersect'の定義が含まれていません

1行のコードを書いてから久しぶりですので、馬鹿げた質問をする場合はしばらくお待ちください。

IntelliSenseは名前の後にIntersectメソッドを表示しますが、2つのIEnumerableを比較しようとすると次のエラーが発生します。

データベースクエリの結果と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);

手伝ってくれてありがとうございます。

11
frankztein

これは、Intersectでは両方のコレクションが同じタイプである必要があるためです。コレクションまたはStudentIWebElementのコレクションを使用して呼び出しようとしています。

Intersectを呼び出す前に、同じタイプのコレクションが2つあることを確認するか、別のメソッドを使用してタスクを実行してください。

両方のコレクションを、簡単に比較できるものに投影することができます(例: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)))

比較したいプロパティがわからないので、述語を意味のあるものに置き換えてください。

11
MarcinJuraszek