gpt4 book ai didi

c# - .Net LINQ - 使用另一个字典过滤字典

转载 作者:行者123 更新时间:2023-12-02 02:56:16 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com