【发布时间】:2015-03-19 08:53:54
【问题描述】:
我想知道在 C# 中查找具有不同记录数的多个集合中的重叠数据的最有效方法是什么?
让我们举个例子:
Set1: +- 20 records Set2: +- 50 records
ID | Value ID | Value
1 | Value01 1 | ValueA
2 | Value02 2 | ValueB
3 | Value03 3 | Value01
4 | Value04 4 | ValueD
5 | Value05 5 | Value17
... ....
20 | Value20 50 | Value XY
Set3: +- 2 000 records Set4: +- 3 000 records
ID | Value ID | Value
1 | Random 1 | Dog
2 | Random02 2 | Duck
3 | Random03 3 | John
4 | Random04 4 | Pen
5 | Ranodm05 5 | Argument
... ....
这个想法是检查,每个集合只包含独占记录。如果一个记录存在于多个表中,则该记录应标记为重叠。
数学上说:
∀A、B、C、D:A ∩ (B ∪ C ∪ D) = {} ∧ B ∩ (C ∪ D) = {} ∧ C ∩ D = {}
我想要实现的是在 C# 中创建一个函数,该函数将 4 个集合作为输入,并可能返回类似于字典的内容。包含3个字典(set1重叠,set2重叠,set3重叠)
所以输出应该是这样的:
var result = new Dictionary<SetsEnum, Dictionary<int, Dictionary<SetsEnum, int>>>
{
{ SetsEnum.Set1,
{
{<set1overlappingRowId1>,
{
{ SetsEnum.<setX>, <overlappingRowIdX> },
{ SetsEnum.<setY>, <overlappingRowIdY> }
}
},
{<set1overlappingRowId2>,
{
{ SetsEnum.<setZ>, <overlappingRowIdZ> }
}
}
}
}
}
我希望我没有在括号中犯任何错误。 基本上它应该这样说:
Set1-Row5 与:Set2-Row42、Set3-Row1513 重叠 Set1-Row18 与:Set4-Row481 重叠 Set2-Row30 与:Set3-Row987 重叠 等等
我希望它足够清楚。
我能想到的唯一方法 id:
- 按大小从小到大排列集
- 对于集合 1 中的每条记录,检查集合 2、3 和 4 中的重叠。
- 对于第 2 组中的每条记录,检查第 3 组和第 4 组中的重叠。
- 对于第 3 组中的每条记录,检查第 4 组中的重叠。
- 返回重叠字典。
在 C# 中是否存在类似这样的更简单的解决方案?
附言。事实上,我想知道另一种解决方案。如果发现任何重叠,用标志标记这条记录,然后只处理不重叠的记录(这可能会加快速度。但这种功能的实现似乎没有必要复杂)
【问题讨论】:
标签: c# performance