我有两个相同类型的字典,A 和 B。
Dictionary<string, IEnumerable<object>>
我正在使用对象来表示具有属性“Id”的复杂类型。
我正在寻找 A 中的所有项目,这些项目都存在于 B 中(使用 Id),但在不同的键下。基本上是判断一个对象是否移动了键。 A 是新字典,B 是旧字典。
有没有一种合理的方法可以使用 LINQ 来实现这一点?我希望结果是 A 中满足条件的所有键值对的字典。提前致谢。
最佳答案
我使用接口(interface) IHasId 来使用 Id 属性:
public interface IHasId
{
int Id { get; }
}
以及继承接口(interface)的 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();
在此示例中,它返回键 111,该键具有 Id = 2 的对象,该对象从键 222 移动到键 111
如果您希望将结果作为字典,您可以使用 ToDictionary 更改 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);
关于c# - .Net LINQ - 使用另一个字典过滤字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59869163/