如何检查字符串是否包含C#中的字符?
是否有一个函数可以应用于一个字符串,如果一个字符串包含一个字符,它将返回true。如何检查字符串是否包含C#中的字符?
我有一个或多个字符选项字符串,例如:
var abc = "s";
var def = "aB";
var ghi = "Sj";
我想例如做的是,如果上述含有大写或小写都将返回true或false的功能“S”。
if (def.Somefunction("s") == true) { }
也在C#中,我需要检查是否这样的事情是真的,或者我可以删除“==真”?
您可以从命名空间System.Linq的使用扩展方法.Contains()
:
if (abc.ToLower().Contains('s')) { }
没有,检查一个布尔表达式为true,则不需要== true
由于Contains
方法是一种扩展方法,我的解决方案似乎让一些人感到困惑。以下是不需要你两个版本添加using System.Linq;
:
if (abc.ToLower().IndexOf('s') != -1) { }
// or:
if (abc.IndexOf("s", StringComparison.CurrentCultureIgnoreCase) != -1) { }
更新
如果你愿意,你可以写自己的扩展方法,方便重用:
public static class MyStringExtensions
{
public static bool ContainsAnyCaseInvariant(this string haystack, char needle)
{
return haystack.IndexOf(needle, StringComparison.InvariantCultureIgnoreCase) != -1;
}
public static bool ContainsAnyCase(this string haystack, char needle)
{
return haystack.IndexOf(needle, StringComparison.CurrentCultureIgnoreCase) != -1;
}
}
然后你可以这样称呼它:
if (def.ContainsAnyCaseInvariant('s')) { }
// or
if (def.ContainsAnyCase('s')) { }
在大多数情况下,当处理用户数据时,您实际上想要使用CurrentCultureIgnoreCase
(或ContainsAnyCase
扩展方法),因为这样您可以让系统处理取决于语言的大小写问题。在处理计算问题时,如HTML标签名称等,您需要使用不变文化。
例如:在土耳其,在小写大写字母I
是ı
(无点),而不是i
(以点)。
bool containsCharacter = test.IndexOf("s", StringComparison.OrdinalIgnoreCase) >= 0;
下面应该工作:
var abc = "sAb";
bool exists = abc.IndexOf("ab", StringComparison.CurrentCultureIgnoreCase) > -1;
这不回答OP的问题 - 他们想知道是否存在大写或小写“s” - 如果小写字母“s”在字符串中,您的解决方案只会评估为真。 – 2012-01-16 12:21:09
可以使用IndexOf
方法,这对于字符串比较类型合适的过载能力:
if (def.IndexOf("s", StringComparison.OrdinalIgnoreCase) >= 0) ...
而且,你不会需要== true
,因为if语句只希望计算结果为bool
表达式。
如果不知道如何使用字符串和布尔值,将很难在C#中工作。但不管怎么说:
String str = "ABC";
if (str.Contains('A'))
{
//...
}
if (str.Contains("AB"))
{
//...
}
MSDN没有列出接受字符的Contains方法,就像在第一个例子中一样。要获得该语法,您需要使用LINQ或编写您自己的Contains扩展。 – 2015-04-23 17:24:30
这里有一个例子大多数都做
using System;
class Program
{
static void Main()
{
Test("Dot Net Perls");
Test("dot net perls");
}
static void Test(string input)
{
Console.Write("--- ");
Console.Write(input);
Console.WriteLine(" ---");
//
// See if the string contains 'Net'
//
bool contains = input.Contains("Net");
//
// Write the result
//
Console.Write("Contains 'Net': ");
Console.WriteLine(contains);
//
// See if the string contains 'perls' lowercase
//
if (input.Contains("perls"))
{
Console.WriteLine("Contains 'perls'");
}
//
// See if the string contains 'Dot'
//
if (!input.Contains("Dot"))
{
Console.WriteLine("Doesn't Contain 'Dot'");
}
}
}
您可以创建自己的extention方法,如果你打算使用这个有很多。
public static class StringExt
{
public static bool ContainsInvariant(this string sourceString, string filter)
{
return sourceString.ToLowerInvariant().Contains(filter);
}
}
用法示例:
public class test
{
public bool Foo()
{
const string def = "aB";
return def.ContainsInvariant("s");
}
}
嗯,我不觉得String.Contains的过载,需要一个char参数。 – 2013-03-13 21:19:02
@ScottSmith这是在[System.Linq](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx)中定义的扩展方法。你需要添加'使用System.Linq;' – pauloya 2013-08-29 15:29:08
我更喜欢使用'str.IndexOf('s')> = 0',但它可能只是一种风格上的差异。阅读理解时,对我来说更有意义。 – CSS 2016-02-10 19:13:58