如何从包含array2中的id的array1中选择all?

时间:2016-12-01 23:28:11

标签: c# linq

我有一个包含Contain()方法的linq语句。我正在使用它,以便我可以从名称不为null的数组中选择all,但只选择object1中包含相同名称的array1中的对象。

我已经设法返回结果但显示true或false,因为我需要对象值。

代码

var response = JsonConvert.DeserializeObject<FamilyNames>(result);
List<object> data = new List<object>();

ClassName className = new ClassName();

object [] getNames = className.GetType()
     .GetProperties()
     .Select(p =>
       {
         object value = p.Name;
         return value == null ? null : value.ToString();
       })
         .ToArray();

foreach (var obj in response.items.Where(n => n.name != null).DistinctBy(x => x.name).Select(a => getNames.Contains(a.initialName)))
{
     data.Add(obj);
}
client.Dispose();
return Json(data, JsonRequestBehavior.AllowGet);
}

结果是:

["True","False","True"]

如果我不使用select语句,那么我会得到我的对象:

[
  {
    "initalName": "BD",
    "firstName": "Bob",
    "LastName": "Dilan"
  },
  {
    "initalName": "HT",
    "firstName": "Harry", // the initialName doesn't exist in list so need to remove this object
    "LastName": "Thomas"
  },
  {
    "initalName": "LJ",
    "firstName": "Lindsey",
    "LastName": "Jones"
  }
]

initalName不存在于getNames数组中,因此需要删除。任何建议都会受到高度赞赏,特别是在方法上。期望的结果是:

[
      {
        "initalName": "BD",
        "firstName": "Bob",
        "LastName": "Dilan"
      },
      {
        "initalName": "LJ",
        "firstName": "Lindsey",
        "LastName": "Jones"
]

1 个答案:

答案 0 :(得分:2)

问题是,在这个LINQ表达式中,最后你选择一个Bool作为输出。 (.Contains()返回一个bool)。 由于这个原因,你的表达式将重新列出Bool列表。

response.items
.Where(n => n.name != null)
.DistinctBy(x => x.name)
.Select(a => getNames.Contains(a.initialName))

要激活你想要的东西,只需用.Where()替换.Select(),做什么预期的过滤并保持原始对象不变,(不做任何投影)你会得到预期结果:

response.items
.Where(n => n.name != null)
.DistinctBy(x => x.name)
.Where(a => getNames.Contains(a.initialName))