我将如何比较这两个字典并仅返回缺少的值?
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?
谢谢
答案 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