在C#中比较两个列表中的两个重复列表

时间:2013-02-27 12:05:17

标签: c#

我有两个列表如下:

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

每个人都有具有相同身份证明的员工记录。 我知道这听起来很奇怪,但这是我现在所处的真实情况!

对于基于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中存在重复项时,意味着如果两个员工具有与123相同的“ID”,则上述代码仍将使用123 id作为更新标记现有员工,因为它在colExistingEmpData中找到完全匹配,而colExistingEmpData只有一个reocrd那个。

当员工记录在任何一个来源中重复出现时,是否有一种方式可以将其记录为“IGNORE”?

我不能使用一个Dictionary对象,我以前曾经使用它,但功能却不喜欢这个想法。

问候。

4 个答案:

答案 0 :(得分:2)

考虑将处理后的列表添加到等式中:

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

然后在循环的顶部添加以下代码:

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

所以你在之前检查另一个列表。这是你做的第一件事,因为你并不在乎它是否已被处理过。

答案 1 :(得分:1)

假设我正确理解你的问题,你总是可以通过employeeID对ExternalList进行排序,然后使用while循环,只需使用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++;
 }

答案 2 :(得分:0)

我不知道这是否会有所帮助,但为什么不合并这两个列表,并删除重复项: -

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

你应该看看这个问题: -

Create a list from two object lists with linq

答案 3 :(得分:0)

另一种方法是覆盖EqualsGetHashCode并使用.Distinct()

MSDN