使用LINQ选择2个列表之间的匹配结果

时间:2019-06-21 13:31:38

标签: c# linq

我有2个列表:

清单1:

[
{
"TPN": "AL M",
"IL": [
  {
    "PIN": 1502103214,
    "Suffix": null
  }
]
},
{
"TPN": "ABC",
"IL": [
  {
    "PIN": 6509507561,
    "Suffix": null
  },
  {
    "PIN": 1234056789,
    "Suffix": null
  }

]
},
{
"TPN": "XYZ",
"IL": [
  {
    "PIN": 7507668878,
    "Suffix": null
  }
]
}
]

清单2:

List<decimal> list2 = new List<decimal>(){ 6509507561, 7507668878 }

我想根据列表2的值过滤列表1。 所以我的最终名单应该是

[
  {
    "TPN": "ABC",
    "IL": [
       {
         "PIN": 6509507561,
         "Suffix": null
       }
     ]
  },
  {
    "TPN": "XYZ",
    "IL": [
       {
        "PIN": 7507668878,
        "Suffix": null
       }
     ]
   }
]

我正在使用的LINQ查询是:

var indInfoTemp = list1.Where(ind => ind.IL.All(x => list2.Any(y => y == x.PIN)))
                       .ToList();

任何人都可以告诉我此查询出了什么问题。

谢谢, 塞吉什

3 个答案:

答案 0 :(得分:1)

任何人都返回bool,因此您在该bool上使用all函数

如果您只想选择列表2中包含的列表1的值,请使用.contains,如下所示:

indInfoTemp = list1.Where(ind => list2.Contains(ind.IL[0].PIN)).ToList();

答案 1 :(得分:1)

您可以检查IL是否包含PIN,然后使用PIN选择来过滤IL

var indInfoTemp = list1.Where(ind => ind.IL.Any(il => list2.Contains(il.PIN)))
                       .Select(ind => new { 
                                 ind.TPN, 
                                 IL = ind.IL.Where(il => list2.Contains(il.PIN))
                                            .ToList()
                         })
                       .ToList();

答案 2 :(得分:1)

您可以使用以下扩展名:

public static class Extensions
{
    public static bool In<T>(T input, params T[] list) => list.Any(item => item.Equals(input));
}

并像这样使用它:

var indInfoTemp = list1.Where(ind => ind.IL.PIN.In(list2.ToArray())).ToList();