【发布时间】:2015-12-08 16:39:32
【问题描述】:
我有一种方法可以使用字典查找两个整数列表之间的差异。本质上,代码循环第一个列表,将每个 int 添加到字典中并设置(在不存在的情况下为 1)/增加值。然后它循环第二个列表设置(到-1,其中不存在)/递减值。
一旦它循环了两个列表,您最终会得到一个字典,其中值 = 0 的键表示匹配,值 >=1 的键表示仅存在于第一个列表中,值
首先,这是一个合理的实现吗?
其次,我想让它更通用,目前它只能处理基于 int 的列表。我想要一些可以处理调用者可能定义比较逻辑的任何对象...
public static Dictionary<int, int> CompareLists(List<int> listA, List<int> listB)
{
// 0 Match
// <= -1 listB only
// >= 1 listA only
var recTable = new Dictionary<int, int>();
foreach (int value in listA)
{
if (recTable.ContainsKey(value))
recTable[value]++;
else
recTable[value] = 1;
}
foreach (int value in listB)
{
if (recTable.ContainsKey(value))
recTable[value]--;
else
recTable[value] = -1;
}
return recTable;
}
提前致谢!
回应: “例如,如果您的相同值在 listA 中出现两次,而在 listB 中出现一次,结果将是肯定的,即在您的 cmets 中显示“仅 listA”,它将无法正常工作。”
让我澄清一下;如果一个值在 listA 中出现两次,它也应该在 listB 中出现两次 - 因此,如果一个值在 listA 中出现两次,在 listB 中出现一次,我不在乎它从 listA 中选择匹配哪一个,只要一个不协调项目报告正确。
想象一下您尝试在两个文件之间核对大量付款金额的用例,重复金额是完全可行的,但只要不核对值匹配哪个重复项并不重要被报道。
【问题讨论】:
-
Firstly, is this a sensible implementation?对于 CodeReview 站点可能会更好,因为它是工作代码。I'd like something that could handle any object where the caller could potentially define the comparison logic你签出IComparable<T>了吗? (编辑:或者实际上是IEquatable<T>?) -
如果你有相同的值在
listA中出现两次,在listB中出现一次,结果将是肯定的,这将在你的 cmets 中显示“仅 listA”。 /跨度> -
您刚刚重新创建了完整的外部联接。
-
什么的合理实现?如果你解释了你的功能背后的目的,人们可以提出更好的方法来实现它。