C#linq有两个列表

时间:2016-07-28 14:18:07

标签: c# linq list

我遇到了以下问题: 我想加载一个List,但我可以传递多个参数,这可能是找到我想要的列表的标准。 现在我有以下结构:

House{
  Name;
  ID;
  Alias;
}

我也有:

Person{
  Name;
  Alias;
}

这意味着,1个房子可以容纳多个人,同名的多个人可以在多个房子里。 所以现在我想打电话给我的功能e.G. " GetHouses(字符串标准)"标准可以是:

  1. a house of a house
  2. 房子的身份证件
  3. 房子名称的一部分
  4. 一个人的名字
  5. 现在我只是阅读每个房子及其数据,然后我按照标准选择。

    重要提示:在此之前我无法更改逻辑!

    所以现在当我尝试找到匹配标准时,我想出了使用LINQ,因为它非常快。只要我不与人物进行比较,它就会起作用:

    result = (from x in result
    where (
      (string.Equals(x.Name, criteria))
      || (string.Equals(x.ID, criteria))
      || (x.Name.Contains(criteria))
      select x).ToList();
    

    现在我想将每个人加载到我找到的房屋中,并检查房屋中的人员名称是否符合标准。 有没有办法在我已经在LINQ中做到这一点? 或者我必须通过以下结果查看结果:

    result.ForEach(x => ...)
    

    如果能与LINQ一起使用会很好。 我用

    做了类似的逻辑
    result.FindAll(new Predicate<House>((x) => { ... LoadPersons(criteria) {... } }));
    

    但这需要很长时间。

    亲切的问候, Asat0r

2 个答案:

答案 0 :(得分:1)

假设您的PersonList课程中有House,您可以使用Enumerable.Any

var matchingHouses = from house in allHouses
    where string.Equals(house.Name, criteria) 
       || string.Equals(house.ID, criteria) 
       || house.Name.Contains(criteria)
       || house.PersonList.Any(resident => string.Equals(resident.Name, criteria))
    select house;

如果您有返回“居民”的方法,可以使用此方法。如果您以后想要访问这些人,您可以创建一个匿名类型来存储它们:

var housesAndResidents = from house in allHouses
    let matchingResidentList = LoadPersons(house.ID)
       .Where(resident => string.Equals(resident.Name, criteria))
       .ToList()
    where string.Equals(house.Name, criteria) 
       || string.Equals(house.ID, criteria) 
       || house.Name.Contains(criteria)
       || matchingResidentList.Any()
    select new { house, matchingResidentList };

您可以通过以下方式访问这些属性:

var matchingHouseList = housesAndResidents.ToList(); 
// you don't need the list, you can use foreach directly,
// but whenever you access housesAndResidents you will execute that query
// ToList materializes this query into a collection, so you can enumerate it or use the Count property
foreach(var x in matchingHouseList )
{
    Console.WriteLine("House:{0} Matching-Resident(s):{1}"
        , x.house.Name
        , String.Join(", ", x.matchingResidentList.Select(r => r.Name)));
}

答案 1 :(得分:0)

以下是使用三个类的简单解决方案:driver = webdriver.Firefox(executable_path='') driver.implicitly_wait(12) driver.switch_to_frame("bvmf_iframe") driver.get("http://www.bmfbovespa.com.br/pt_br/produtos/listados-a-vista-e-derivativos/renda-variavel/empresas-listadas.htm") driver.find_element_by_id("ctl00_contentPlaceHolderConteudo_BuscaNomeEmpresa1_btnTodas") ProgramHouse

班级Person&#34;房屋&#34; (双关语)一个类House的列表(以及您自己的值:name,id和alias)。通过这种方式,居民是房子的一部分,而不是存储在其他地方。将居民存放在Person课程之外与将背包箱内的午餐盒内容放在一起是一样的。

班级House存储有关该房屋居民的基本信息。在Person课程中列出居民列表可以更轻松地将搜索条件与人员进行比较。

在课程House中,您会找到ProgramMain课程。这些有点解释自己

FindHouses

我不知道你的代码中是否有太大的变化,但无论如何,我希望这会有所帮助。

我知道你提到过你并不想把这些人装进房子里,但是这样可以根据&#34;所有价值观来搜索房屋。更容易