c# - 从具有 "priority"的列表中删除重复项

标签 c# .net algorithm list distinct

给定这样的记录集合:

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/

相关文章:

c# - 无法将 C# dll 注册为 COM 组件,模块已加载但未找到入口点 DLLRegisterServer

c# - 在 ASP.NET Identity 中获取登录用户列表

arrays - 嵌套循环的时间复杂度取决于父循环 i

algorithm - 将形状描画为最大 n 条边的多边形

c# 将 int 缩短为区分大小写的代码

c# - Bitmap.LockBits "pin"位图是否存入内存?

c# - 在 .NET DrawingContext DrawText 方法中计算文本换行

c# - 为过滤器的多个条件创建动态 linq 表达式 OData 包含?

c# - 任何 cpu 和 x64 之间的托管代码引用

java - 当需要嵌套循环时,如何提高空间和时间复杂度 Big(0)?