【问题标题】:Get record from list based values from another list从另一个列表中获取基于列表的值的记录
【发布时间】:2022-01-21 21:30:30
【问题描述】:

我有两个这样声明和填写的列表:

List<MyType> list1 = new List<MyType>();
List<MyType> list2 = new List<MyType>();

list1.Add(new MyType() { PropertyA = "Value1", PropertyB = "00" });
list1.Add(new MyType() { PropertyA = "Value1", PropertyB = "06" });
list1.Add(new MyType() { PropertyA = "Value1", PropertyB = "08" });
list1.Add(new MyType() { PropertyA = "Value1", PropertyB = "11" });
list1.Add(new MyType() { PropertyA = "Value1", PropertyB = "12" });
list1.Add(new MyType() { PropertyA = "Value2", PropertyB = "00" });
list1.Add(new MyType() { PropertyA = "Value2", PropertyB = "06" });
list1.Add(new MyType() { PropertyA = "Value2", PropertyB = "09" });
list1.Add(new MyType() { PropertyA = "Value2", PropertyB = "11" });
list1.Add(new MyType() { PropertyA = "Value2", PropertyB = "13" });
list1.Add(new MyType() { PropertyA = "Value2", PropertyB = "14" });
list1.Add(new MyType() { PropertyA = "Value3", PropertyB = "09" });
list1.Add(new MyType() { PropertyA = "Value3", PropertyB = "10" });
list1.Add(new MyType() { PropertyA = "Value3", PropertyB = "11" });
list1.Add(new MyType() { PropertyA = "Value3", PropertyB = "12" });
list1.Add(new MyType() { PropertyA = "Value3", PropertyB = "13" });
list1.Add(new MyType() { PropertyA = "Value3", PropertyB = "14" });

list2.Add(new MyType() { PropertyA = "Value1" });
list2.Add(new MyType() { PropertyA = "Value2" });
list2.Add(new MyType() { PropertyA = "Value3" });

我的目标是使用 C# 中的 LINQ 从 list1 中获取唯一的带有 PropertyB 的记录,该记录存在于所有具有 list2.PropertyA == list1.PropertyA 的元素中强>。

在我的示例中,我必须得到这个值:PropertyB = "11"

我怎样才能得到这个值?

提前致谢。

【问题讨论】:

  • 在你的例子中,你也得到 14
  • @CaiusJard:是的,对不起,错误的例子。我已经纠正了。谢谢

标签: c# linq


【解决方案1】:

如果列表是不同的并且与问题中的完全相同(listA PropertyA 仅包含 listB 中的内容,而不包含 Value4 等),则按 propertyB 对 listA 进行分组,并查找具有 listB.Count 个值的分组

例如

var r = list1.GroupBy(a => a.PropertyB)
  .Where(g => g.Count() == listB.Count)
  .Select(g => g.Key);

如果 listA 可能包含像 Value4 这样的 PropertyA 而不是 ListB 的成员,则涉及更多。把 listB 变成 HashSet 让事情变得更简单

var hash2 = list2.Select(s => s.PropertyA).ToHashSet();
var r = list1.GroupBy(a => a.PropertyB, a => a.PropertyA)
  .Where(g => hash2.SetEquals(g))
  .Select(g => g.Key);
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2018-12-08
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多