将项目添加到TList中的高效且准确的方法

时间:2012-05-08 03:05:25

标签: c# asp.net

我有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个客户端也在人口客户端中,但我需要获取不在客户端中的人口客户端列表。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

如果我理解你在寻找什么,这里有一种方法可以使用LINQ ...

tempList = populationList.Where(p => !clientList.Any(p2 => p2.ID == p.ID));

答案 2 :(得分:0)

只是提供另一个基于LINQ的答案......我认为你的意图是根据“客户端”(从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,或其他任何操作。