给定这样的记录集合:
string ID1;
string ID2;
string Data1;
string Data2;
// :
string DataN
最初 Data1..N 为空,对于这个问题几乎可以忽略。 ID1 和 ID2 都唯一标识记录。所有记录都有一个 ID2;有些还会有 ID1。给定一个 ID2,有一个(耗时的)方法来获取它对应的 ID1。给定一个 ID1,有一个(耗时的)方法来获取 Data1..N 用于记录。我们的最终目标是尽快为所有记录填写Data1..N。
我们的直接目标是(尽快)消除列表中的所有重复项,保留包含更多信息的那个。
例如,如果 Rec1 == {ID1="ABC", ID2="XYZ"} 和 Rec2 = {ID1=null, ID2="XYZ"},那么这些是重复的,--- 但我们必须专门删除 Rec2 并保留 Rec1。
最后一个要求消除了删除重复项的标准方法(例如 HashSet),因为它们认为“重复项”的两面是可以互换的。
最佳答案
如何将原始列表分成 3 个 - 包含所有数据的列表、包含 ID1 的列表和仅包含 ID2 的列表。
然后做:
var unique = allData.Concat(id1Data.Except(allData))
.Concat(id2Data.Except(id1Data).Except(allData));
仅根据 ID2 定义了相等性。
我怀疑有更有效的表达方式,但据我所知,基本思想是合理的。将初始列表拆分为三个只需使用 GroupBy
(然后在每个组上调用 ToList
以避免重复查询)。
编辑:可能更好的想法:像以前一样拆分数据,然后执行:
var result = new HashSet<...>(allData);
result.UnionWith(id1Data);
result.UnionWith(id2Data);
我相信 UnionWith
会保留现有 元素,而不是用新的但相等的元素覆盖它们。另一方面,没有明确指定。如果定义明确就好了...
(同样,要么使您的类型基于 ID2 实现相等性,要么使用这样做的相等性比较器创建哈希集。)
关于c# - 从具有 "priority"的列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683944/