【问题标题】:Find subset in List of objects based on matched property in string array根据字符串数组中的匹配属性在对象列表中查找子集
【发布时间】:2015-05-28 15:56:04
【问题描述】:

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

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

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

  1. ID(除了上面字符串数组中存在的每个id之外什么都没有)
  2. 管理员姓名
  3. 管理员类型

我从服务方法中获得所有可能的 AdminList

List<Admins> allAdminList = someserviceclient.Admins;

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

你能帮我找到最好的方法吗?如果可能的话,可以结合使用 foreach 和 linq 查询吗?

【问题讨论】:

    标签: c# linq


    【解决方案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));
    

    关于以下关于空 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(',')...);
    

    【讨论】:

    • 谢谢你们。 @JasonWilczak - 如果 selectedEnrollAdmin 为空,此代码将失败,不是吗?有没有办法在不显式检查的情况下处理 null?
    • 谢谢,尽管 ID 是一个字符串字段,在现有代码中由于某种原因不是 int,
    • 有趣,是的,我添加了 Int32 解析选项,因为在大多数情况下,我认为 id 字段将是一个 int。
    【解决方案2】:

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

    所以你可以试试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多