删除两个列表之间的非唯一对象C#

问题描述 投票:0回答:3

我有两个对象列表,我想删除我的第一个列表中的第二个列表'对象的所有外观。基本上,获取第一个列表中相对于第二个列表的所有唯一值(列表本身没有重复项)。表达这个问题的另一种方式是:如何在自定义列表上使用列表函数。我读过周围的内容,人们建议重写 Equals 函数,我已经这样做了,但它对我没有帮助。我目前拥有的:

filteredEntries
actuallyFilteredEntries
一开始是相同的,
entries
是一个独立的列表。 (我尝试使用
actuallyFilteredEntries
基本上作为
filteredEntries
的副本,我可以在其中删除条目或以其他方式操作数据。

for (int i = 0; i < entries.Count; i++)
{
    for (int j = 0; j < filteredEntries.Count; j++)
    {
        if (filteredEntries[j].Equals(entries[i]))
        {
            duplicateCount++;
            // prints false
            Console.WriteLine(actuallyFilteredEntries.Remove(filteredEntries[j]));

        }
    }
}

这就是我希望它工作的方式,但显然你必须在

Remove()
f.e. 中使用相同的对象。
actuallyFilteredEntries.Remove(actuallyFilteredEntries[j])
。问题是,我遇到了索引越界错误。

我也尝试过 LINQ 方法,但无济于事。

var etc = actuallyFilteredEntries.Except(entries);

预期结果:我留下了一个唯一值列表,现实:(它保存了所有

actuallyFilteredEntries
,而不丢弃任何
entries
)。

我将添加我的

Equals()
GetHashCode()
方法覆盖,也许其中有一些我没能找到的错误:

public bool Equals(Entry entry)
{
    if (Object.ReferenceEquals(entry, null))
    {
        return false;
    }
    if (this.GetType() != entry.GetType())
        return false;

    return (Desired_due_date == entry.Desired_due_date) && (Order_number== entry.Order_number) && (Series_number == entry.Series_number)
        && (Product_name == entry.Product_name) && (Product_code == entry.Product_code) && (ProcessesID== entry.ProcessesID)
        && (Ordered_amount== entry.Ordered_amount) && (Amount_made== entry.Amount_made) && (Start_date== entry.Start_date);
}
public override int GetHashCode()
{
    return this.Desired_due_date.GetHashCode() ^ this.Order_number.GetHashCode() ^ this.Series_number.GetHashCode() ^ this.Product_name.GetHashCode()
        ^ this.Product_code.GetHashCode() ^ this.ProcessesID.GetHashCode() ^ this.Ordered_amount.GetHashCode() ^ this.Amount_made.GetHashCode()
        ^ this.Start_date.GetHashCode();
}

任何帮助或想法都表示赞赏,无论我如何做(效率等),我只需要一个独特的列表(两个中的一个)。

c# list linq equality
3个回答
0
投票

var etc = actuallyFilteredEntries.Union(entries)

可以在此处找到其文档:.Union MS Docs

退货 IE可枚举 一个 IEnumerable,包含两个输入序列中的元素,不包括重复项。


0
投票

不使用 LINQ 回答:

var seen = new HashSet<T>(filteredEntries);
for (var i = 0; i < entries.Count; i++)
{
  if (seen.Contains(entries[i]))
  {
    entries.RemoveAt(i);
    i--;
  }
}

0
投票

借助 LINQ Union Operator,您就可以实现它。
请检查以下代码。

List<string> objList_1 = new List<string>() {"A","B","C","D" };
List<string> objList_2 = new List<string>() { "A", "B", "E", "F" };
var vUniqueList = objList_1.Intersect(objList_2).ToList();

======OutPut ============
"A"
"B"

如果您只想要两个列表中的唯一值,请检查以下代码

var result = objList_1.Except(objList_2).Concat(objList_2.Except(objList_1)).ToList();

====Output=======
"C"
"D"
"E"
"F"
© www.soinside.com 2019 - 2024. All rights reserved.