- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两本字典Dictionary<string, object>
.我需要找到它们的交集(我的意思只是它们的键交集)和 A\B 和 B\A 减法并对对象进行一些操作(实际上我的对象是 EntityFramework 实体,我必须将它们的状态标记为 Modified
, Added
和 Deleted
,尽管它与问题不是很相关)。想象一下最简单的Venn diagram .
我想以最有效的方式进行。我想我有两个选择:
1) 实现一组内部操作的通用扩展方法 IEnumerable
KeyCollection
上的方法喜欢ExceptByKey
,例如:
public static Dictionary<TKey, TValue> ExceptByKeys<TKey, TValue>(this Dictionary<TKey, TValue> dict1, Dictionary<TKey, TValue> dict2)
{
return dict1.Keys.Except(dict2.Keys).ToDictionary(key => key, key => dict1[key]);
}
然后我可以操作这些方法来分别处理三个组中的每一个。来自 there我知道 KeyCollection.Contains
方法内部使用 Dictionary<TKey, TValue>.ContainsKey
方法所以两者都是O(1)。所以我的 Except
然后方法将在 O(n) 中运行,是这样吗?我需要为每个字典使用一次,并以某种方式检测相交的部分,这可以通过首先遍历所有字典来隐式完成字典中的实体并将它们标记为属于交集。那么,它是不是像 O(n) + O(n + m)?
2) 我也可以遍历我的字典调用 ContainsKey
另一个字典上的每个元素的方法并做适当的事情。在我看来,这似乎是一个更好的解决方案,因为我只得到 O(n + m) 复杂度。
所以,问题是:- 我的计算是否正确?- 有没有我没有想过的更好的方法来完成我想要的?
2015 年 6 月 19 日更新
所以我选择了第二种情况并且它工作正常。这是我在野外的实现
using (var he = new HostEntities())
{
var dbHardDrives = he.HardDrive.Where(_ => _.HostName == _address).ToDictionary(_ => _.Name, _ => _);
foreach (var dbHd in dbHardDrives)
{
if (wmiHardDrives.ContainsKey(dbHd.Key))
{
he.Entry(dbHd.Value).State = EntityState.Detached;
he.Entry(wmiHardDrives[dbHd.Key]).State = EntityState.Modified;
}
else
{
he.Entry(dbHd.Value).State = EntityState.Deleted;
}
}
foreach (var wmiHd in wmiHardDrives)
{
if (!dbHardDrives.ContainsKey(wmiHd.Key))
{
he.Entry(wmiHd.Value).State = EntityState.Added;
}
}
he.SaveChanges();
}
最佳答案
我觉得你的推理很有道理。 LINQs Except()
迭代第二个集合,将其放入 HashSet
Set
在遍历第一个集合之前,对 Set
执行查找 - 它是 O(n + m)。因此,您的扩展方法也是 O(n + m)。正如您提到的,如果您想要计算 3 组增减交集,您将不得不多次调用它,使选项 2 更可取。
您正在尝试进行外部联接,并能够分别计算左项、内项和右项。对于 O(n + m) 解决方案,您可以使用类似这样的东西
public static JoinResult<TKey> JoinKeys<TKey, TValue>(this IDictionary<TKey, TValue> first, IDictionary<TKey, TValue> second)
{
var left = new List<TKey>();
var inner = new HashSet<TKey>(); // HashSet to optimize lookups
var right = new List<TKey>();
foreach (var l in first.Keys) // O(n)
{
if (second.ContainsKey(l))
inner.Add(l);
else
left.Add(l);
}
foreach (var r in second.Keys) // O(m)
{
if (!inner.Contains(r))
right.Add(r);
}
return new JoinResult<TKey>
{
Left = left,
Inner = inner,
Right = right
};
}
public class JoinResult<T>
{
public IEnumerable<T> Left { get; set; }
public IEnumerable<T> Inner { get; set; }
public IEnumerable<T> Right { get; set; }
}
关于c# - 在 KeyCollection 上使用 IEnumerable.Except 与利用 Dictionary.ContainsKey 进行与性能相关的相互减法和交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923171/
我正在用 Python (2.6) 编写一个应用程序,需要我使用字典作为数据存储。 我很好奇拥有一个大字典是否更节省内存,或者将其分解为许多(很多)较小的字典,然后拥有一个包含对所有较小字典的引用的“
Convert this [ "Cat" : ["A" : 1, "B": 2], "Mat" : ["C" : 3, "D": 4] ] Into [ "A" : 1,
有什么很酷的快速方法可以让两个字典创建第三个字典,以内连接方式将第一个字典的键映射到第二个字典的值? Dictionary dic1 = new Dictionary {{a1,b1},{a2,b2}
我希望将字典相互嵌套,以便容纳 block 的 xy 坐标。所以我会 IDictionary, IDictionary> 键 Dictionary 包含列、行组合,而值 Dictionary 包含 x
在 C# 中,我需要将数据保存在字典对象中,如下所示: Dictionary> MyDict = new Dictionary>(); 现在我意识到,在某些情况下我需要一些其他(不是字典类的)
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
我似乎无法理解这个问题。我需要使用 LINQ 按内部字典的值对字典进行排序。有什么想法吗? 最佳答案 你的意思是你想要所有的值,按内部值排序? from outerPair in outer from
我想建模一个模式,其中响应是字典: { 'id1': { 'type': 'type1', 'active': true, }, 'id2': { 'type':
我有以下代码要添加或更新(如果已经存在)dict()-dict 中的值: if id not in self.steps: self.steps[ id ] = step else:
我有一个包含字典的 Swift 字典,我想使用存储的属性来访问键值: var json = [NSObject:AnyObject]() var title: String { get
我想创建一个 Dictionary>结构,我想提供一个 IEqualityComparer在包含 APerson 的second 字典中作为关键 如果我只有内部字典,那就是 var f = new D
我有一个集合,其中包含如下文档:文档 1: { "company": "ABC" "application": { "app-1": {"earning_from_src_A": 50,
我正在快速学习。 我发现 dictionary 就像 hash 用于 PHP 或其他一些语言。 那我怎么制作dictionary的dictionary呢?? 我有这样的数据 key:J name:jh
这个问题在这里已经有了答案: Explode a dict - Get all combinations of the values in a dictionary (2 个答案) 关闭 5 个月前
我是编程新手,所以如果我的问题看起来很愚蠢,我很抱歉。我想问一下有没有办法从 Multi.Dictionary 返回key当我有值(value)? 这是我的代码: Dim myDict Set myD
我试图找出标准 Ada 库是否配备了“字典”类型(我的意思是:一种以 格式存储值的数据结构,我可以从中检索 value 使用相应的唯一 key)。 这样的数据结构存在吗?如果是这样,有人可以提供一个
我究竟做错了什么?根据我的测试,objDic.exists 永远不会给出 False! dim objDic set objDic = createobject("scripting.
我想创建一个复合类型,其中包含一个字典作为其命名字段之一。但是明显的语法不起作用。我敢肯定有一些我不明白的基本原理。下面是一个例子: type myType x::Dict() end Jul
julia> hotcell2vocab = Dict([(cell, i-1+vocab_start) for (i,cell) in enumerate(h
我有一个简单的问题:我对 Dictionary.Value 集合进行了很多次迭代,这让我很烦,我必须调用 .ToList() 然后才能调用 .ForEach(),因为它似乎没有可枚举的Dictiona
我是一名优秀的程序员,十分优秀!