我有两个相同类型的字典,A和B。
Dictionary<string, IEnumerable<object>>
我正在使用对象来表示一个具有属性'Id'的复杂类型。
我正在查找所有在A中具有存在于B中的对象(使用Id),但在不同的键下。这基本上是告诉我们一个对象是否已经更改了键。A是新字典,B是旧字典。
是否有一种合理的方法使用LINQ来完成这个任务?我希望结果是满足条件的A中所有键值对的字典。先谢谢。
我使用IHasId接口来使用Id属性:
public interface IHasId
{
int Id { get; }
}
继承了该接口的AAA类:
public class AAA: IHasId
{
public int Id { get; set; }
}
这是你要找的linq:
Dictionary<string, IEnumerable<IHasId>> A = new Dictionary<string, IEnumerable<IHasId>>();
A.Add("111", new List<IHasId> { new AAA { Id = 1 }, new AAA { Id = 2 } });
A.Add("333", new List<IHasId> { new AAA { Id = 3 } });
Dictionary<string, IEnumerable<IHasId>> B = new Dictionary<string, IEnumerable<IHasId>>();
B.Add("111", new List<IHasId> { new AAA { Id = 1 }});
B.Add("222", new List<IHasId> { new AAA { Id = 2 }});
B.Add("333", new List<IHasId> { new AAA { Id = 3 } });
var res = A.Where(a => a.Value.Any(c => B.Any(v => v.Value
.Select(x => x.Id).Contains(c.Id) && a.Key != v.Key))).ToList();
var res = A.Where(a => a.Value.Any(c => B.Any(v => v.Value
.Select(x => x.Id).Contains(c.Id) && a.Key != v.Key)))
.ToDictionary(a=>a.Key, a=>a.Value);
如果你想在新的字典中只保留发生更改的值,就像示例中的键111和仅具有Id = 2的对象的值一样,可以按照以下方式实现:
var res = A.Select(a => new KeyValuePair<string, IEnumerable<IHasId>>(a.Key,
a.Value.Where(c => B.Any(v => v.Value.Select(x => x.Id).Contains(c.Id) && a.Key != v.Key))))
.Where(a=>a.Value.Count() > 0)
.ToDictionary(a => a.Key, a => a.Value);
var res = A.SelectMany(a => a.Value.Where(c => B.Any(v => v.Value.Select(x => x.Id).Contains(c.Id) && a.Key != v.Key))).ToList();
- s-sLookup<object,string>
。Union
(而不是Concat
)来消除重复项。var lookup = listA
.Union( listB )
.ToLookup( pair => pair.Value, pair => pair.Key );
var results = lookup.Where( x => x.Count() > 1);
var result = A.Where(a => B.Any(b => b.Key != a.Key && b.Value.Intersect(a.Value).Any()));
var result = A.Select(a => new KeyValuePair<string, IEnumerable<object>>(a.Key, B.Where(b => b.Key != a.Key).SelectMany(b => b.Value.Intersect(a.Value)))).Where(x => x.Value.Any());
Intersect
提供自定义的相等比较器以通过ID或其他方式匹配项目。new Dictionary<string, IEnumerable<object>>(result)
。var dictionary = (
from a in (from entry in A from Value in entry.Value select new { entry.Key, Value })
join b in (from entry in B from Value in entry.Value select new { entry.Key, Value })
on ((dynamic)a.Value).Id equals ((dynamic)b.Value).Id
where a.Key != b.Key
select a
).ToDictionary(a => a.Key, a => a.Value);
Dictionary<string,IEnumerable<object>>
时它可以工作。 - Marcelo Estriga
A
? - Rufus L