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);
手伝ってくれてありがとうございます。
これは、Intersect
では両方のコレクションが同じタイプである必要があるためです。コレクションまたはStudent
とIWebElement
のコレクションを使用して呼び出しようとしています。
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)))
比較したいプロパティがわからないので、述語を意味のあるものに置き換えてください。