如何在C#中使用linq查询来查找包含“B”和“BZ”的字符串?要找到只有“B”的字符串,我使用:
var query = from c in mapping
where c.code.Contains("B")
select c;'
但是如果我说where c.code.Contains("B") && where c.code.Contains("BZ")
显然我只得到了具有BZ的字符串,因为第一个约束将在第二个约束中得到满足。但我需要的是让字符串都有“B”和“BZ”。 (实际上我的话应该有两个B)。
答案 0 :(得分:4)
我建议使用正则表达式,例如:
where Regex.Match(c, ".*(B.*BZ)|(BZ.*B).*").Success
样品:
static void Main()
{
var mapping = new[]
{
"BBZ",
"B",
"ABBA",
"BZBZ",
"BZAB",
"BBZ",
"ZBBAZ"
};
// the code
var query = from c in mapping
where Regex.Match(c, ".*(B.*BZ)|(BZ.*B).*").Success
select c;
Console.WriteLine("Matched:");
foreach (string s in query)
{
Console.WriteLine(s);
}
}
输出:
Matched:
BBZ
BZBZ
BZAB
BBZ
答案 1 :(得分:1)
实际上我的话应该有两个B
(如果你想在Linq中使用)
var query = mapping.code.Where(s => s.Count(f=>f=='B')==2);
答案 2 :(得分:1)
不依赖于正则表达式的解决方案
var x = from s in mapping
let index1 = s.IndexOf("BZ") // find any 'BZ' in the string
where index1 > -1 // ensure that a 'BZ' was found else the following queries will throw
let index2 = s.IndexOf('B', 0, index1) // find the first B in the string
let index3 = s.IndexOf('B', index1 + 1) // find a second B in the string
where index2 > -1 || index3 > -1
select s;
诀窍是首先找到BZ,然后在找到的BZ之前或之后找到B。 IndexOf运算符是完美的,因为它允许我们选择一个起始位置(在找到的BZ之后)和一个计数(在找到的BZ之前)。
答案 3 :(得分:1)
如果字符串中只有B
和BZ
,则可以检查字符串中B
出现的次数。因此,如果您检查BZ
并检查B
至少发生2次,那么您将获得所需的字符串
var query = from c in mapping
where c.code.Contains("B") && // not really necessary but I keep it to make it explicit what we are looking for.
c.code.Contains("BZ") &&
c.code.Count(l => l == 'B') >= 2
select c;
答案 4 :(得分:0)
你应该只有一个where子句。你的第二个地方搞乱了。
where c.code.Contains("B") && c.code.Contains("BZ")