比较2个字典并返回缺失值

时间:2020-07-05 13:24:21

标签: c# dictionary .net-core

我将如何比较这两个字典并仅返回缺少的值?

GetFileListFromBlob()函数获取所有文件名,我想知道数据库中缺少什么。

还是有更好的方法从这些对象中获取缺失值?我应该使用其他键/值吗?

Dictionary<int, string> databaseFileList = new Dictionary<int, string>;
Dictionary<int, string> blobFileList = new Dictionary<int, string>;

int counter = 0;
foreach (string f in GetFileListFromDB())
{
    counter++;
    databaseFileList.Add(counter,  f );
}

counter = 0;
foreach (string f in GetFileListFromBlob())
{
    counter++;
    blobFileList.Add(counter, f);
}

// How to compare?

谢谢

3 个答案:

答案 0 :(得分:3)

您可能想要一个HashSet<T>(而不是Dictionary<K,V>)-例如:

var reference  = new HashSet<string> {"a", "b", "c", "d"};
var comparison = new HashSet<string> {"a",           "d", "e"};

当您现在调用参考集上的ExceptWith时...

reference.ExceptWith(comparison);

... reference集将包含"b"集中不存在的元素"c"comparison。但是请注意,没有捕获到额外的元素"e"(交换集合以将"e"作为丢失的元素),并且该操作就地修改了参考集合。如果不希望这样,Except LINQ运算符可能值得研究,就像在另一个答案中已经提到的那样。

答案 1 :(得分:0)

按照我的看法,您一开始不需要计数器(以后可以添加它们)。

您可以使用System.Collections.Generic.List<>类型继续。

List<int, string> databaseFileList = new List<string>(GetFileListFromDB());
List<int, string> blobFileList = new List<string>(GetFileListFromBlob());

//some code

现在,如果要同时获取两个列表中的所有项目,则可以简单地使用Concat(...)方法将它们统一,然后使用Distinct()方法删除重复的项目:

List<string> allItems = databaseFileList.Concat(blobFileList).Distinct();

现在使用Except(...)方法比较集合:

var missingItems1 = allItems .Except(databaseFileList);
//or
var missingItems1 = allItems .Except(blobFileList);
//or
//some other code

答案 2 :(得分:0)

ltrim