【问题标题】:HOWTO: Change values in IList<object> properties如何:更改 IList<object> 属性中的值
【发布时间】:2015-02-26 06:13:21
【问题描述】:

我有一个对象列表(下面查询中的 rList)。每个对象(下面查询中的 v)内部都有 6 个字符串对象。我需要查询每个属性并将值更改为 null 如果它等于某个字符串。

有没有比执行 6 个不同的 linq 查询更简单的方法(即:对 6 个属性中的每一个属性中的一个)?

foreach (var v in rList.Where(ppe => ppe.Property1 != null
                && (ppe.Property1.Equals(warning1, StringComparison.OrdinalIgnoreCase)
                    || ppe.Property1.Equals(warning2, StringComparison.OrdinalIgnoreCase)
                    || ppe.Property1.Equals(warning3, StringComparison.OrdinalIgnoreCase))))
            {
                ppe.Property1 = null;
            }

【问题讨论】:

  • v.property1 = null;您可以使用复杂的 where 子句在一个查询中执行此操作。您可以创建警告列表并使用包含
  • @GiorgiNakeuri 他需要有条件地清空某些值,而不是无条件地清空所有值。
  • 这只是为了让它更容易(这是有效的)还是因为它的大小而遍历rList六次有问题?

标签: c# linq


【解决方案1】:

您可以做的第一件事是将所有警告放在一个集合中,然后在查询中使用该集合的操作:

var warnings = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    warning1,
    warning2,
    warning3,
};
foreach(var item in rList.Where(ppe => warnings.Contains(ppe.Property1)))
    item.Property1 = null;

请注意,只要集合不包含空值(意味着警告1、警告2 和警告3 不是null),就不需要对Where 进行空检查。

【讨论】:

  • 我认为要获得相同的效果,您需要将ContainsIEqualityComparer 一起使用。 hashset 的StringComparer 用于比较集合中的项目。
  • @GertArnold 在接受IEqualityComparer&lt;T&gt;hashSet 中没有Contains 的重载。它总是使用构造函数中指定的比较器(或者使用默认值,如果构造函数没有指定)。这当然是可以预料的;使用与将项目添加到集合中的比较器不同的比较器,无法在 HashSet 中找到值。
  • 嗯,是实例方法。
  • 那行得通。我需要 6 个 foreach,但这很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2017-12-26
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多