1

我有 2 个列表,这些列表的实体有一些 ID,例如

Client.ID,其中 ID 是 Client anf 的属性,然后我有PopulationClient.ID,其中 ID 是类 PopulationClient 的属性。所以我有两个列表

TList<Client> clients = clientsHelper.GetAllClients();
TList<PopulationClient> populationClients = populationHelper.GetAllPopulationClients();

那么我有一个临时列表

TList<Client> temp_list = new TList<Client>();

所以我遇到的问题是有效和正确地做到这一点。这是我尝试过的..但我没有得到正确的结果

foreach(PopulationClient pClients in populationClients)
{
    foreach(Client client in clients)
     {
         if(pClients.ID != client.ID  &&  !InTempList(temp_list, pClients.ID))
         {
             temp_list.Add(client);
         }
     }
}

public bool InTempList(TList<Client> c, int id)
{
    bool IsInList = false;
    foreach(Client client in c)
    {
        if(client.ID == id)
        {
              IsInList = true;
        }
    }    
   return IsInList;
}

因此,虽然我试图正确地做到这一点,但我无法想出一个好的方法,这并没有返回正确的数据,因为在我在顶部第一个循环中的语句中,在某些时候一个或多个不同于另一个,所以无论如何它都会添加它。您认为我应该在这里检查哪些限制,以便我最终得到一个客户列表,这些客户在人口客户中但不在客户中?

例如,人口客户将有 4 个客户和客户 2,这 2 个也在人口客户中,但我需要获取不在客户中的人口客户列表。

任何帮助或指针将不胜感激。

4

3 回答 3

2

首先,让我们专注于获得正确的结果,然后我们将进行优化。

考虑你的嵌套循环:你会得到太多的肯定,因为在大多数 (pclient, client) 对中,ID 不匹配。我想你想这样编码:

foreach(PopulationClient pClients in populationClients)
{
     if(!InTempList(clients, pClients.ID) && !InTempList(temp_list, pClients.ID))
     {
         temp_list.Add(client);
     }
}

现在为了该代码的效率:InTempList在列表中使用线性搜索。这效率不高 - 考虑使用搜索速度更快的结构,例如哈希集。

于 2012-05-08T03:13:30.327 回答
0

如果我了解您在寻找什么,这是一种使用 LINQ 的方法...

tempList = populationList.Where(p => !clientList.Any(p2 => p2.ID == p.ID));
于 2012-05-08T03:45:06.463 回答
0

只是为了提供另一个基于 LINQ 的答案...我认为您的意图是根据“clients”中的所有项目(从 GetAllClients 返回)填充 tempList,这些项目未在 populationClients 中显示(基于“ID”值)收藏。

如果是这种情况,那么我将假设 populationClients 足够大,可以保证进行基于哈希的查找(例如,如果它少于 10 个项目,则线性扫描可能没什么大不了的)。

所以我们想要一个来自 populationClients 集合的所有 ID 值的快速查找版本:

var populationClientIDs = populationClients.Select(pc => pc.ID);
var populationClientIDHash = new HashSet(populationClientIDs);

现在我们有了要在快速查找数据结构中忽略的 ID 值,然后我们可以将其用作客户端的过滤器:

var filteredClients = clients.Where(c => populationClientIDHash.Contains(c.ID) == false);

根据使用/需要,您可以从“filteredClients”填充 tempList,或者执行 ToList 或其他任何操作。

于 2012-05-08T04:26:32.063 回答