根据字符串数组中的匹配属性查找对象列表中的子集

时间:2015-05-28 15:56:05

标签: c# linq

我有一个场景,我有一个以逗号分隔的管理员ID字符串作为控制器方法参数接收。 我将它拆分并存储到字符串数组

string[] strSelectedAdmin = selectedEnrollAdmin.Split(',');

我有一个Admin DataContract List<Admins>列表,每个项目都有3个属性 -

  1. ID(上面的字符串数组中只有每个id)
  2. AdminName
  3. AdminType
  4. 我从服务方法中获取所有可能的AdminList

    List<Admins> allAdminList = someserviceclient.Admins;
    

    我想根据字符串数组allAdminList中匹配的adminId从strSelectedAdmin过滤出子集列表

    你能帮助我在这里找到最好的方法吗?可能是foreach和linq查询的组合吗?

2 个答案:

答案 0 :(得分:1)

首先,我会找到两个列表共有的ID。 然后使用这些结果我会找到管理员。

所以你可以试试:

var results = strSelectedAdmin.Intersect(allAdminList.Select(admin => admin.Id));
var Admins = allAdminList.Where(admin => results.Contains(admin.Id));

答案 1 :(得分:1)

与@ Steffsww的回答相似,你可以在一行中完成所有这些。我提供了两个选项,因为OP使用字符串id字段,但大多数情况下int id字段可能是这样解决的情况:

如果您的对象具有字符串Id属性:

var admins = allAdminList.Where(admin=>selectedEnrollAdmin.Split(',').Contains(admin.Id));

如果您的对象具有整数Id属性:

var admins = allAdminList.Where(admin=>selectedEnrollAdmin.Split(',').Select(Int32.Parse).ToList().Contains(admin.Id));

关于以下关于null selectedEnrollAdmin值的评论,我看到了几个选项:

1:使参数具有默认值,上面的代码应该没有问题:

public ActionResult MyAction(string selectedEnrollAdmin = "")

2:在你达到你的逻辑之前逃避:

if(string.IsNullOrWhiteSpace(selectedEnrollAdmin)) return; //throw new Exception('some message');

3:内联处理:

var admins = allAdminList.Where(admin=>(selectedEnrollAdmin??string.Empty).Split(',')...);