我有一种方法,它使用字典查找两个ints列表之间的差异。本质上,代码循环第一个列表,将每个int添加到字典中,并设置(在尚未出现的情况下为1)/incrementing值。然后循环第二个列表设置(在尚未出现的情况下为-1 ),/decrementing值。
一旦它循环了这两个列表,您将得到一个字典,其中值=0的键表示匹配,值>=1的键仅表示第一个列表中的存在,值<=-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中出现一次,结果将是肯定的,它将不能正常工作,在您的评论中只显示"listA”。“
让我澄清一下;如果一个值在listA中出现两次,那么它也应该在listB中出现两次--所以如果一个值在listA中出现两次,在listB中出现一次,那么我不关心它从listA选择匹配哪个值,只要正确地报告了一个不对齐项。
假设在用例中,您试图在两个文件之间调节大量的支付金额,有重复的金额是完全可行的,但是只要报告了不调节的值,那么重复的金额匹配到哪一个并不重要。
发布于 2015-12-08 16:52:45
您可以使用Generics来完成这一任务:
public static Dictionary<T, int> CompareLists<T>(List<T> listA, List<T> listB)
{
// 0 Match
// <= -1 listB only
// >= 1 listA only
var recTable = new Dictionary<T, int>();
foreach (T value in listA)
{
if (recTable.ContainsKey(value))
recTable[value]++;
else
recTable[value] = 1;
}
foreach (T value in listB)
{
if (recTable.ContainsKey(value))
recTable[value]--;
else
recTable[value] = -1;
}
return recTable;
}https://stackoverflow.com/questions/34161261
复制相似问题