检查字符串中是否以任意顺序包含特定字符

11

我尝试解释我要做的事情的最好方法是通过举例:

我在数据库中有一个字符串 StackOverflow,当用户键入OAW时,我希望返回该字符串和任何包含这三个字符中的任何顺序的单词。

我尝试使用各种LINQ / Lambda表达式进行操作,但没有成功。

query.Where(a => a.SerialNumber.Contains(a));

我在SO上找到了一个帖子(链接),看起来很像我的问题,但它是用Java写的。

我觉得我要做的事情非常简单,但我可能没有做对。任何帮助将不胜感激。

4个回答

6
你可以尝试像这样做:

你可以尝试像这样做:

query.Where(str => value.All(str.SerialNumber.Contains));

针对你数据库中的任意单词,你需要检查valueOAW(使用All扩展方法)的所有字符是否都包含在str.SerialNumber中。

更新

这个

str.SerialNumber.Contains

等同于这个lambda表达式:

x => str.SerialNumber.Contains(x)
< p > x指的是我们应用All时序列中的随机元素。换句话说,它是value的随机字符。


调用 ToCharArray 太浪费了。字符串已经是 IEnumerable<char>,所以你可以立即在它上面使用 LINQ。这样就变成了 Nathan 的解决方案。 - Jeppe Stig Nielsen
@JeppeStigNielsen 你说得完全正确。感谢你的评论! - Christos
@Christos 你从哪里获取 'a',以便你可以执行 a.All()? - HiTech
@Christos 我成功地让你之前的答案工作了。但是我似乎无法弄清如何实现你编辑过的答案。如果你能更好地解释一下如何使用你的新答案,我将接受它作为我的答案。 - HiTech
@HiTech 你好,我不得不更正我的答案。让我向你解释一下发生了什么事情。 - Christos
@HiTech,欢迎你,伙计!我很高兴能帮到你! - Christos

1
您可以使用一个ContainsAll类型的函数。
public static bool ContainsAllItems(IEnumerable<T> a, IEnumerable<T> b)
{
    return !b.Except(a).Any();
}

注意

该函数是从这里借用的。


使用 IEnumerable<>,而不是 List<>。字符串是 IEnumerable<char>,但不是 List<> - Jeppe Stig Nielsen
我不确定如何使用这个方法。还是有点新手 =/ - HiTech
那么你可以这样写 query.Where(a => !searchLetterStr.Except(a.SerialNumber).Any()),对吧?只是为了内联并摆脱该方法。 - Jeppe Stig Nielsen
1
这个函数是从这里借来的 - 你还回去了吗? - Quantic

1
你可以通过稍微修改代码来实现这一点:
public bool DoesContain(char[] identifiers, string containingString)
{
    return !identifiers.Except(containingString.ToCharArray()).Any();
}

或者:

private char[] identifiers = { /* Your identifiers*/ };

public bool DoesContain(string containingString)
{
    return !identifiers.Except(containingString.ToCharArray()).Any();
}

任一种方法如果字符串包含指定的字符,将返回true。
注意:
Cameron MacFarland在此问题中提供了解决方案。

我刚刚尝试了这个。对于任何包含字符数组中任一字符的字符串,它都返回true。 - HiTech
你想要查看字符串是否包含所有字符吗? - CalebB
是的。如果“containingString”最少包含所有“identifies”,我希望它返回true。我会编辑我的帖子使其更清楚。 - HiTech
更新的答案以配合此事。我的错误。 - CalebB

0

看起来你可以进行多个比较并使用 && 连接它们,或者使用正则表达式。我更喜欢前者,这里是一个简洁的例子:

arrOfCharacters.All(a.SerialNumber.Contains)

虽然你可能需要在代码中添加 ToUpperInvariant()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接