0

我正在重构以下语句。

IEnumerable<String> 
  input = ...,
  filter = ...,
  output = input.Where(filter.Contains(element));

目前,它按预期工作,但以这种方式匹配的单词需要准确。在我的客户的语言中,有很多变位,并且要求使用百搭字符(“dog”应该匹配“dog”、“doggy”和“dogmatic”)。

我建议进行以下更改。不过,现在可以肯定的是,如果它可以被视为对眼睛来说是光滑的。有人可以提出改进建议还是尽可能好?

IEnumerable<String> 
  input = ...,
  filter = ...,
  output = input.Where(word => filter.Any(head => word.StartsWith(head)))

我正在考虑IEqualityComparer实现,但这仅适用于相同类型的对象,而我的条件是String contra IEnumerable

4

1 回答 1

1

一般来说,你已经拥有的 LINQ 语句很好,我认为它“看起来很流畅”没有什么大问题(LINQ 调用通常比这更失控)。

如果你愿意,你可以将它移动filter.Any(head => word.Startswith(head))到一个单独的Func<string, bool>委托中并将其传递给:

Func<string, bool> myConstraint = word => filter.Any(head => word.StartsWith(head)); 
output = input.Where(myConstraint);

您还可以将约束构造移动到单独的方法中,如果匹配规则发生变化或必须涵盖更复杂的情况,这可能会为您的客户带来一定的灵活性:

private Func<string, bool> BuildConstraints()
{
    filter = ...,
    if (CheckEqualityOnly)
        return word => filter.Contains(word);
    else
        return word => filter.Any(head => word.StartsWith(head)); 
}

output = input.Where(BuildConstraints());
于 2013-05-23T10:28:42.053 回答