我有一个场景,我有一个以逗号分隔的管理员ID字符串作为控制器方法参数接收。 我将它拆分并存储到字符串数组
string[] strSelectedAdmin = selectedEnrollAdmin.Split(',');
我有一个Admin DataContract List<Admins>
列表,每个项目都有3个属性 -
我从服务方法中获取所有可能的AdminList
List<Admins> allAdminList = someserviceclient.Admins;
我想根据字符串数组allAdminList
中匹配的adminId从strSelectedAdmin
过滤出子集列表
你能帮助我在这里找到最好的方法吗?可能是foreach和linq查询的组合吗?
答案 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(',')...);