2012-01-16 3 views
28

Есть ли функция, которую я могу применить к строке, которая вернет true для false, если строка содержит символ.Как проверить, содержит ли строка символ в C#?

У меня есть строки с одним или несколькими вариантами символов, таких как:

var abc = "s"; 
var def = "aB"; 
var ghi = "Sj"; 

То, что я хотел бы сделать, например, это есть функция, которая будет возвращать истинным или ложным, если выше содержит нижнюю или верхнюю часть корпуса "s".

if (def.Somefunction("s") == true) { } 

Кроме того, в C# мне нужно проверить, если что-то верно, как это или я могу просто удалить «== правда»?

ответ

67

Вы можете использовать метод расширения .Contains() из пространства имен System.Linq:

if (abc.ToLower().Contains('s')) { } 

И нет, чтобы проверить, если логическое выражение истинно, то вам не нужно == true

Так как Contains метод является методом расширения, мое решение, похоже, смущает некоторых. Вот две версии, которые не требуют, чтобы добавить using System.Linq;:

if (abc.ToLower().IndexOf('s') != -1) { } 

// or: 

if (abc.IndexOf("s", StringComparison.CurrentCultureIgnoreCase) != -1) { } 

Update

Если вы хотите, вы можете написать свой собственный метод расширения для облегчения повторного использования:

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(с точкой).

+9

Хм, я не нахожу перегрузки String.Contains, которая принимает аргумент обугленного. –

+11

@ScottSmith Это метод расширения, определенный в [System.Linq] (http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx). Вам нужно добавить 'using System.Linq;' – pauloya

+2

Я предпочитаю использовать 'str.IndexOf ('s')> = 0', но это, вероятно, просто стилистическая разница. Для меня это имеет смысл, когда читаешь для понимания. – CSS

2
bool containsCharacter = test.IndexOf("s", StringComparison.OrdinalIgnoreCase) >= 0; 
2

Следующие должны работать:

var abc = "sAb"; 
bool exists = abc.IndexOf("ab", StringComparison.CurrentCultureIgnoreCase) > -1; 
2

использовать функцию String.Contains();

пример вызова,

abs.Contains("s"); // to look for lower case s 

here больше от MSDN.

+1

Это не отвечает на вопрос OPs - они хотели знать, присутствует ли верхний или нижний регистр «s» - ваше решение будет оценивать только true, если строчная «s» была в строке. –

8

Вы можете использовать IndexOf метод, который имеет соответствующую перегрузку для типов сравнения строк:

if (def.IndexOf("s", StringComparison.OrdinalIgnoreCase) >= 0) ... 

Кроме того, вам не нужно будет в == true, так как если оператор ожидает только выражение, которое вычисляет bool ,

3

Будет сложно работать на C#, не зная, как работать со строками и булерами. Но в любом случае:

 String str = "ABC"; 
     if (str.Contains('A')) 
     { 
      //... 
     } 

     if (str.Contains("AB")) 
     { 
      //... 
     } 
+3

MSDN не отображает метод Contains, который принимает символ, как в вашем первом примере. Чтобы получить этот синтаксис, вам нужно использовать LINQ или написать собственное расширение Contains. –

0

вот пример того, что большинство сделали

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'"); 
     } 
    } 
} 
2

Вы можете создать свой собственный метод Удлинитель, если вы планируете использовать это много.

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"); 
    } 
}