3

我有两个这样的列表:

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

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

对于 colExternalEmpData 中基于 EmpId 的每个员工,对 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 中有重复项时,这意味着如果两个员工的“ID”与 123 相同,上述代码仍会将 id 为 123 的现有员工标记为更新,因为它在 colExistingEmpData 中找到了完全匹配,前提是 colExistingEmpData 只有一个具有该 ID 的记录。

当员工记录在任一来源中重复时,是否可以将其标记为“忽略”?

我不能使用 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

假设我正确理解了您的问题,您始终可以按employeeID 对ExternalList 进行排序,然后不使用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

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

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

你应该看看这个问题: -

使用 linq 从两个对象列表创建列表

于 2013-02-27T12:12:58.833 回答
0

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

MSDN

于 2013-02-27T12:28:59.247 回答