我有两个相同类型的字典,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/

10-17 01:13