C# List<T>的Contains与Equals方法解析与应用

版权申诉
0 下载量 200 浏览量 更新于2024-07-01 收藏 3.11MB DOC 举报
"C# 有关List<T>的Contains与Equals方法" C# 中的 `List<T>` 是一个常用的集合类,它提供了动态数组的功能。在处理数据时,`List<T>` 的 `Contains` 和 `Equals` 方法是两个非常重要的成员,它们在不同场景下有着不同的用途。 ### `List<T>.Contains` 方法 `List<T>.Contains` 方法用于检查列表中是否包含指定的元素。它的语法如下: ```csharp public bool Contains(T item) ``` 参数 `T item` 是要查找的元素。方法返回一个布尔值,表示列表中是否存在这个元素。这个方法基于 `T` 类型的默认 `Equals` 实现,也就是元素的 `==` 运算符。如果元素类型实现了 `IEquatable<T>` 接口,那么 `Contains` 将使用该接口提供的 `Equals` 方法。 ### `List<T>.Equals` 方法 `List<T>.Equals` 方法则用于比较两个 `List<T>` 是否相等。它的实现考虑了两个方面的相等性:结构相等性和值相等性。 - **结构相等性**:两个列表包含相同的元素,并且顺序也相同。 - **值相等性**:两个列表包含的元素通过各自的 `Equals` 方法判断相等,顺序可以不同。 默认的 `Equals` 方法会比较两个列表的引用是否相同。如果需要比较值相等性,可以重写 `Equals` 方法或使用 `SequenceEqual` 方法。`SequenceEqual` 需要传入一个序列,并基于元素的 `Equals` 比较每个对应位置的元素是否相等。 ```csharp // 默认的 Equals,比较引用 public override bool Equals(object obj) // 比较两个列表的值相等性 public bool SequenceEqual(IEnumerable<T> other) ``` ### 集合比较与去重 在处理集合时,经常需要比较两个集合是否相等或者进行去重操作。对于去重,可以使用 `HashSet<T>` 或 `Distinct` 方法。例如: ```csharp List<T> list = ...; List<T> uniqueList = new HashSet<T>(list).ToList(); // 使用 HashSet 去重 List<T> distinctList = list.Distinct().ToList(); // 使用 Distinct 去重 ``` ### 举例与问题分析 在描述中提到的 LeetCode 题目,题目要求统计满足特定条件的子数组数量。一开始使用 `List` 存储子数组并检查重复,但发现结果不正确。后来将 `List` 替换为 `HashSet` 后,问题得到解决。这是因为 `HashSet` 在去重方面更高效,且不会像 `List` 那样因顺序不同而误判两个子数组为不等。 ### 总结 理解 `List<T>` 的 `Contains` 和 `Equals` 方法对于编写高效的 C# 代码至关重要。`Contains` 用于快速查找元素,而 `Equals` 可以用于比较列表的整体相等性。在处理大量数据时,考虑到性能,可能需要使用 `HashSet` 或其他数据结构来优化去重和比较操作。正确理解和使用这些方法,能帮助我们编写出更加健壮和高效的代码。

List<DataPermissionSchema> dataPermissionSchemaList = new ArrayList<>(); for (DataPermissionSchemaEo dataPermissionSchemaEo : dataPermissionSchemaEoList) { List<SchemaRowRule> schemaRowRules = new ArrayList<>(); List<SchemaColumnRule> schemaColumnRules = new ArrayList<>(); DataPermissionSchema dataPermissionSchema = new DataPermissionSchema(); for (SchemaRowRule schemaRowRule : userRowRuleList) { if (schemaRowRule.getSchemaCode().equals(dataPermissionSchemaEo.getSchemaCode()) && dataPermissionSchemaEo.getDatabaseCode().equals(schemaRowRule.getDatabaseCode())) { dataPermissionSchema.setDatabaseCode(dataPermissionSchemaEo.getDatabaseCode()); dataPermissionSchema.setSchemaCode(dataPermissionSchemaEo.getSchemaCode()); schemaRowRules.add(schemaRowRule); } } for (SchemaColumnRule schemaColumnRule : userColumnRuleList) { if (schemaColumnRule.getSchemaCode().equals(dataPermissionSchemaEo.getSchemaCode()) && dataPermissionSchemaEo.getDatabaseCode().equals(schemaColumnRule.getDatabaseCode())) { dataPermissionSchema.setDatabaseCode(dataPermissionSchemaEo.getDatabaseCode()); dataPermissionSchema.setSchemaCode(dataPermissionSchemaEo.getSchemaCode()); schemaColumnRules.add(schemaColumnRule); } } if(dataPermissionSchema.getSchemaCode() == null || dataPermissionSchema.getDatabaseCode() == null){ continue; } dataPermissionSchema.setSchemaRowRuleList(schemaRowRules); dataPermissionSchema.setSchemaColumnRuleList(schemaColumnRules); dataPermissionSchemaList.add(dataPermissionSchema); } //设置UserAgent的数据权限 UserAgent.setDataPermissionSchema(dataPermissionSchemaList);代码优化

2023-05-25 上传

帮我写完这段代码: boolean dynLotTemp = false;//批次 String dynLotTempAfter = ""; boolean dynLotTable = false; boolean dynAmtTemp = false;//费用 String dynAmtTempAfter = ""; boolean dynAmtTable = false; boolean dynInvTemp = false;//开票 String dynInvTempAfter = ""; boolean dynInvTable = false; boolean dynFeaTemp = false;//特征 String dynFeaTempAfter = ""; boolean dynFeaTable = false; String lotModify = "";//批次是否可修改 List<String> lotColumns = new ArrayList<>();//批次明细column List<String> amtColumns = new ArrayList<>();//费用明细column List<String> invColumns = new ArrayList<>();//开票明细column List<String> feaColumns = new ArrayList<>();//特征明细column for (DynArea area : formAreas) { //temp动态批次 if (GlobalConstant.BOOLEAN_0.equals(area.getDtype()) && StringUtils.isNotBlank(area.getDynLot()) && GlobalConstant.BOOL_Y.equals(area.getDynLot())) { dynLotTemp = true; dynLotTempAfter = area.getName(); if (StringUtils.isBlank(area.getModify()) || !GlobalConstant.DYNAREA_MODIFY_LOT_N.equals(area.getModify())) { lotModify = "Y"; } } //table动态批次 if (GlobalConstant.BOOLEAN_1.equals(area.getDtype()) && StringUtils.isNotBlank(area.getDynLot()) && GlobalConstant.BOOL_Y.equals(area.getDynLot())) { dynLotTable = true; lotColumns.add(area.getColumn()); } //temp动态费用项目 if (GlobalConstant.BOOLEAN_0.equals(area.getDtype()) && StringUtils.isNotBlank(area.getDynAmt()) && GlobalConstant.BOOL_Y.equals(area.getDynAmt())) { dynAmtTemp = true; dynAmtTempAfter = area.getName(); } //table动态费用项目 if (GlobalConstant.BOOLEAN_1.equals(area.getDtype()) && StringUtils.isNotBlank(area.getDynAmt()) && GlobalConstant.BOOL_Y.equals(area.getDynAmt())) { dynAmtTable = true; amtColumns.add(area.getColumn()); } //temp动态开票 //table动态开票 //temp动态特征 //table动态特征

2023-04-19 上传

List<DataPermissionSchemaEo> dataPermissionSchemaEoList = comDataComponent.getDataPermissionSchemaList(); List<SchemaRowRuleEo> schemaRowRuleList = comDataComponent.getSchemaRowRuleList(); List<SchemaColumnRuleEo> schemaColumnRuleList = comDataComponent.getSchemaColumnRuleList(); //设置行权限 根据用户id和用户组织去获取 List<SchemaRowRule> userRowRuleList = schemaRowRuleList.stream() .filter(schemaRowRuleEo -> { List<String> userList = JSONObject.parseArray(schemaRowRuleEo.getRowPermissionUserList(), String.class); List<String> orgList = JSONObject.parseArray(schemaRowRuleEo.getRowPermissionOrgList(), String.class); return userList.contains(userUid) || orgList.contains(orgCode) || userList.contains(WILDCARD) || orgList.contains(WILDCARD); }) .map(schemaRowRuleEo -> { SchemaRowRule schemaRowRule = new SchemaRowRule(); BeanUtils.copyProperties(schemaRowRuleEo, schemaRowRule); return schemaRowRule; }) .collect(Collectors.toList());List<SchemaColumnRule> userColumnRuleList = schemaColumnRuleList.stream() .filter(rule -> { List<String> userList = Optional.ofNullable(rule.getColumnPermissionUserList()) .map(userListStr -> JSONObject.parseArray(userListStr, String.class)) .orElse(Collections.emptyList()); List<String> orgList = Optional.ofNullable(rule.getColumnPermissionOrgList()) .map(orgListStr -> JSONObject.parseArray(orgListStr, String.class)) .orElse(Collections.emptyList()); return userList.contains(userUid) || orgList.contains(orgCode) || userList.contains(WILDCARD) || orgList.contains(WILDCARD); }) .map(rule -> { SchemaColumnRule columnRule = new SchemaColumnRule(); BeanUtils.copyProperties(rule, columnRule); return columnRule; }) .collect(Collectors.toList()); List<DataPermissionSchema> dataPermissionSchemaList = dataPermissionSchemaEoList.stream().map(dataPermissionSchemaEo -> { List<SchemaRowRule> schemaRowRules = userRowRuleList.stream() .filter(schemaRule -> dataPermissionSchemaEo.getDatabaseCode().equals(schemaRule.getDatabaseCode()) && dataPermissionSchemaEo.getSchemaCode().equals(schemaRule.getSchemaCode())) .collect(Collectors.toList()); List<SchemaColumnRule> schemaColumnRules = userColumnRuleList.stream() .filter(schemaRule -> dataPermissionSchemaEo.getDatabaseCode().equals(schemaRule.getDatabaseCode()) && dataPermissionSchemaEo.getSchemaCode().equals(schemaRule.getSchemaCode())) .collect(Collectors.toList()); if(!schemaRowRules.isEmpty() || !schemaColumnRules.isEmpty()) { DataPermissionSchema dataPermissionSchema = new DataPermissionSchema(); dataPermissionSchema.setDatabaseCode(dataPermissionSchemaEo.getDatabaseCode()); dataPermissionSchema.setSchemaCode(dataPermissionSchemaEo.getSchemaCode()); dataPermissionSchema.setSchemaRowRuleList(schemaRowRules); dataPermissionSchema.setSchemaColumnRuleList(schemaColumnRules); return dataPermissionSchema; } return null; }).filter(Objects::nonNull).collect(Collectors.toList());把这段代码改造成每个用户拥有的行权限和列权限

2023-05-26 上传
2023-05-25 上传