1

私は2つのリストを持っており、それらのリストのエンティティには、たとえばいくつかのIDがあります

Client.ID,ここで、IDはClient anfのプロパティであり、私は持っていますPopulationClient.ID。ここで、IDはクラスPopulationClientのプロパティです。だから私は2つのリストを持っています

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;
}

したがって、正しく実行しようとしている間、それを実行するための良い方法を思い付くことができませんが、これは正しいデータを返していません。これは、上部の最初のループのステートメントで、ある時点で1つ以上がもう1つなので、とにかく追加します。ここでチェックする必要がある制約は何だと思いますか。そうすれば、母集団クライアントにはあるがクライアントにはないクライアントのリストだけが表示されます。

たとえば、母集団クライアントには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ベースの回答を提供するために...あなたの意図は、populationClientsに(「ID」値に基づいて)表示されない「clients」(GetAllClientsから返された)のすべてのアイテムに基づいてtempListを設定することだと思いますコレクション。

その場合は、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 に答える