3

私は次のような2つのリストを持っています:

List<EmpData> colExistingEmpData;
List<EmpData> colExternalEmpData;

それぞれに、同じ ID を持つ従業員レコードがあります。これは奇妙に聞こえるかもしれませんが、それは私が今いる実際の状況です!

EmpId に基づく colExternalEmpData のすべての従業員について、colExistingEmpData でチェックが行われます。

foreach (EmpData employee in colExternalEmpData)
{
  var queryResult = colExistingEmpData.FindAll(thisEmployee => thisEmployee.Id == employee.Id);

  if(querResult.count == 0)
  {
    // Mark as INSERT
  } 
  else if(querResult.count == 1)
  {
    // Mark as UPDATE
  }
  else // queryResult is more than 1
  {
    // data is duplicated mark as IGNORE
  }

  analysedData.Add(employee);

これは、colExistingEmpData に「Id」の値が重複していない場合に正常に機能します。

colExternalEmpData に重複がある場合、つまり、2 人の従業員が 123 と同じ「ID」を持っている場合、上記のコードは、colExistingEmpData で完全に一致する ID を見つけるため、123 ID を持つ既存の従業員を更新としてマークします。

いずれかのソースで従業員レコードが繰り返されている場合に、従業員レコードを「IGNORE」としてマークする方法はありますか?

Dictionary オブジェクトを使用することはできません。以前に使用したことがありますが、その機能が気に入らなかったためです。

よろしく。

4

4 に答える 4

2

処理されたリストを方程式に追加することを検討してください。

List<int> processed = new List<int>();

次に、ループの先頭に次のコードを追加します。

if (processed.Contains(employee.Id)) { continue; }
processed.Add(employee.Id);

したがって、他のリストをチェックする前にそれを行います。すでに処理されているかどうかはあまり気にしないため、最初に行うことです。

于 2013-02-27T12:11:46.183 に答える
1

私があなたの問題を正しく理解していると仮定すると、いつでもExternalListをemployeeIDでソートし、Foreachループを使用する代わりに、whileループを使用してidが同じである間は従業員をスキップできます。

+- これはコードがどのように見えるべきかを整数に縮小したものです:

List<int> external = new List<int>() { 1, 2, 2, 5, 1, 3 };
List<int> internalList = new List<int>() { 1, 4, 5, 3 };
external.Sort();
int index = 0;
int item = -1;
while (index < external.Count)
{
    if (external[index] != item)
    {
       item = external[index];
       internalList.FindAll(t => t == item);
    }
    index++;
 }
于 2013-02-27T12:15:42.607 に答える
0

別の方法は、とをオーバーライドしEqualsGetHashCode使用することです.Distinct()

MSDN

于 2013-02-27T12:28:59.247 に答える
0

これが役立つかどうかはわかりませんが、2つのリストをマージして重複を削除してみませんか:-

var mergedList = list1.Union(list2).ToList();

この質問をチェックしてください:-

linq を使用して 2 つのオブジェクト リストからリストを作成する

于 2013-02-27T12:12:58.833 に答える