【问题标题】:Compare 2 List of object's boolean property and return the boolean value true if they matches比较 2 对象的布尔属性列表,如果它们匹配,则返回布尔值 true
【发布时间】:2020-05-01 08:39:47
【问题描述】:

我有 2 个 CheckGroupActivity 类型的对象。

phoneActivity 和 gericaActivity,每个都有 Clients List 作为属性,Client 类有一个布尔属性 hasRestrictedClientAccess。

现在我想根据这个属性比较这 2 个列表,如果所有匹配,则返回 true。

尝试了以下解决方案,但它总是给我错误(意味着它们不相等),即使它们是。

var restrictedClientAccessIsSame = phoneActivity.Clients?.All(p => gericActivity.Clients.All(g => g.HasRestrictedClientAccess == p.HasRestrictedClientAccess))

请帮忙。 前任。

【问题讨论】:

  • 请不要将代码发布为图像并分享最小可重现示例
  • 所以你想检查phoneActivity[0].HasRestrictedClientAccess == gericaActivity[0].HasRestrictedClientAccess AND ``phoneActivity[1].HasRestrictedClientAccess == gericaActivity[1].HasRestrictedClientAccess` 等吗?这两个数组的长度肯定是一样的吗?
  • .All 检查所有元素的条件是否为真,但情况可能并非如此。使用 .Where
  • @canton7 是的,没错。想这样检查。它们的长度也相同。
  • 它们是否总是保证相同的顺序?我看到Client 有一个Id 字段,所以我的假设是具有相同Id 的客户需要具有相同的HasRestrictedClientAccess 值?如果两个列表的顺序相同,您可以使用 Zip 解决方案(在 imo 中仍然存在风险),如果不是,您需要在 Id 上查找匹配项并检查它们。

标签: c# arrays linq


【解决方案1】:

假设两个数组长度相同,且ID顺序相同,则可以使用Zip

phoneActivity.Clients
   .Zip(gericaActivity.Clients, (x, y) => x.HasRestrictedClientAccess == y.HasRestrictedClientAccess)
   .All(x => x);

【讨论】:

    【解决方案2】:

    我已经尝试过这个,考虑到索引及其工作。

    var restrictedClientAccessIsSame = phoneActivity.Clients.All(p => gericActivity.Clients[phoneActivity.Clients.IndexOf(p)].HasRestrictedClientAccess == p.HasRestrictedClientAccess);
    

    【讨论】:

    • 这是二次的,很容易得到线性解(见我的回答)
    猜你喜欢
    • 2016-07-05
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多