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

标签 c# .net linq

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

相关文章:

c# - c++ 从 c#-dll 调用函数失败

c# - 如何解决这个 Javascript/Razor 问题?

c# - 类型 'System.Int32' 的表达式不能用于返回类型 'System.Object'

c# - 文本框验证是否允许一个“。 ”值C#

.net - 为什么 Graphics.DrawLine 绘制楔形?

c# - 按最小值对列表列表进行排序

c# - 完整.NET Framework和.NET Core之间的lambda表达式差异

c# - 如何独立于数据加载 UI

c# - 正则表达式与 C# 的工作方式不同吗?

c# - 在 Linq 查询中创建列表