当元素表示(部分)在另一个字符串数组中时,过滤字符串数组

时间:2013-05-18 13:25:31

标签: c# linq

我正在重构以下陈述。

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

现在,它可以正常工作,但这样匹配的单词需要准确。在我的客户的语言中有很多结合,并且要求被发布以使用小丑字符(“狗”应该匹配“狗”,“狗狗”和“教条”)。

我建议进行以下更改。但是,现在肯定,如果它可以被认为是顺利的眼睛。有人可以提出一项改进措施,还是会有所改善?

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

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

1 个答案:

答案 0 :(得分:1)

一般来说,你已经拥有的LINQ语句很好,而且我没有看到一个关于它“光滑的眼睛”的大问题(LINQ调用通常会比这更加失控)。< / p>

如果您愿意,可以将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());