Existe uma maneira de tornar o seguinte retorno verdadeiro?
string title = "ASTRINGTOTEST";
title.Contains("string");
Não parece haver uma sobrecarga que permita definir a distinção entre maiúsculas e minúsculas. Atualmente, eu supero os dois, mas isso é simplesmente bobo (pelo qual estou me referindo aos problemas da i18n que vêm com a caixa para cima e para baixo).
ATUALIZAÇÃO
Esta pergunta é antiga e, desde então, percebi que pedi uma resposta simples para um tópico realmente vasto e difícil, se você quiser investigá-lo completamente.
Para a maioria dos casos, em bases de código monolíngües e inglesas, essa resposta será suficiente. Eu suspeito que porque a maioria das pessoas que vem aqui se enquadre nessa categoria, essa é a resposta mais popular.
Essa resposta, no entanto, traz à tona o problema inerente de que não podemos comparar maiúsculas e minúsculas até que saibamos que os dois textos são da mesma cultura e sabemos o que é essa cultura. Talvez essa seja uma resposta menos popular, mas acho que é mais correta e foi por isso que a marquei como tal.
fonte
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Ele usa a cultura certa e não diferencia maiúsculas de minúsculas, não aloca seqüências minúsculas temporárias e evita a questão de se converter para minúsculas e comparar é sempre o mesmo que uma comparação sem distinção entre maiúsculas e minúsculas.Você pode usar o método String.IndexOf e passar
StringComparison.OrdinalIgnoreCase
como o tipo de pesquisa a ser usado:Melhor ainda é definir um novo método de extensão para string:
Observe que a propagação nula
?.
está disponível desde C # 6.0 (VS 2015), para versões mais antigas useUSO:
fonte
paragraph.ToLower(culture).Contains(word.ToLower(culture))
comCultureInfo.InvariantCulture
e não resolve nenhum problema de localização. Por que complicar demais as coisas? stackoverflow.com/a/15464440/284795ToLower
versão inclui 2 alocações desnecessárias em uma operação de comparação / pesquisa. Por que alocar desnecessariamente em um cenário que não exige isso?string
é umIEnumerable<char>
, portanto, você não pode usá-lo para encontrar substringsstring.IndexOf(string)
é usar a cultura atual, enquanto o padrão parastring.Contains(string)
é usar o comparador ordinal. Como sabemos, o primeiro pode ser alterado, causando uma sobrecarga mais longa, enquanto o último não pode ser alterado. Uma conseqüência dessa inconsistência é o seguinte exemplo de código:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Você pode usar
IndexOf()
assim:Como 0 (zero) pode ser um índice, você verifica com -1.
MSDN
fonte
Solução alternativa usando Regex:
fonte
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
para qualquer um, se ajudar."."
no"This is a sample string that doesn't contain the search string"
. Ou tente procurar"(invalid"
por esse assunto.Regex.Escape
poderia ajudar. O Regex ainda parece desnecessário quandoIndexOf
/ extensionContains
é simples (e sem dúvida mais claro).Você sempre pode subir ou baixar as strings primeiro.
Opa, acabei de ver essa última parte. Uma comparação sem distinção entre maiúsculas e minúsculas
*
provavelmente*
faria o mesmo de qualquer maneira, e se o desempenho não for um problema, não vejo problema em criar cópias em maiúsculas e compará-las. Eu poderia jurar que uma vez vi uma comparação que não diferencia maiúsculas de minúsculas ...fonte
Somente .NET Core 2.0+ (a partir de agora)
O .NET Core possui um par de métodos para lidar com isso desde a versão 2.0:
Exemplo:
Com o tempo, eles provavelmente entrarão no .NET Standard e, a partir daí, em todas as outras implementações da Base Class Library.
fonte
Um problema com a resposta é que ele lançará uma exceção se uma string for nula. Você pode adicionar isso como uma verificação para que não:
fonte
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
A classe StringExtension é o caminho a seguir. Combinei algumas das postagens acima para dar um exemplo de código completo:
fonte
StringComparison
?Isso é limpo e simples.
fonte
fileNamestr
tem quaisquer caracteres especiais regex (por exemplo*
,+
,.
, etc.), então você vai estar em uma grande surpresa. A única maneira de fazer essa solução funcionar como umaContains
função adequada é escaparfileNamestr
fazendo issoRegex.Escape(fileNamestr)
.OrdinalIgnoreCase, CurrentCultureIgnoreCase ou InvariantCultureIgnoreCase?
Como isso está faltando, aqui estão algumas recomendações sobre quando usar qual:
Dos
StringComparison.OrdinalIgnoreCase
para comparações como seu padrão seguro para correspondência de sequência independente de cultura.StringComparison.OrdinalIgnoreCase
comparações para aumentar a velocidade.StringComparison.CurrentCulture-based
operações de cadeia ao exibir a saída para o usuário.StringComparison.Ordinal
ouStringComparison.OrdinalIgnoreCase
quando a comparação forlinguisticamente irrelevante (simbólica, por exemplo).
ToUpperInvariant
vez deToLowerInvariant
normalizar seqüências de caracteres para comparação.Não é
StringComparison.InvariantCulture
string baseadas em usona maioria dos casos; uma das poucas exceções seria a
persistência de dados linguísticos, mas culturalmente agnósticos.
Com base nessas regras, você deve usar:
enquanto [YourDecision] depende das recomendações acima.
link da fonte: http://msdn.microsoft.com/en-us/library/ms973919.aspx
fonte
Estas são as soluções mais fáceis.
Por índice de
Alterando maiúsculas e minúsculas
Por Regex
fonte
Eu sei que esse não é o C #, mas no framework (VB.NET) já existe essa função
Variante C #:
fonte
O
InStr
método do assembly VisualBasic é o melhor se você tiver uma preocupação com a internacionalização (ou você pode reimplementá-lo). Olhando para ele, o dotNeetPeek mostra que não apenas conta maiúsculas e minúsculas, mas também caracteres do tipo kana e caracteres de largura total vs. meia largura (principalmente relevantes para os idiomas asiáticos, embora também existam versões em largura total do alfabeto romano). ) Estou pulando alguns detalhes, mas confira o método privadoInternalInStrText
:fonte
Bem assim:
fonte
Usa isto:
fonte
Contains
nãoCompare
.Contains
comIndexOf
. Portanto, essa abordagem é igualmente útil! O exemplo de código C # nesta página está usando string.Compare (). A escolha da equipe do SharePoint!Isso é bastante semelhante a outro exemplo aqui, mas eu decidi simplificar enum para bool, primário porque outras alternativas normalmente não são necessárias. Aqui está o meu exemplo:
E o uso é algo como:
fonte
Usar um RegEx é uma maneira direta de fazer isso:
fonte
Apenas para desenvolver a resposta aqui, você pode criar um método de extensão de string para tornar isso um pouco mais amigável:
fonte
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
lugar.se você quiser verificar se sua sequência passada está na sequência, existe um método simples para isso.
Este valor booleano retornará se a string estiver contida ou não
fonte
Tão simples e funciona
fonte
fonte
Você pode usar a
string.indexof ()
função Isso não diferencia maiúsculas de minúsculasfonte
O truque aqui é procurar a string, ignorando maiúsculas e minúsculas, mas mantê-la exatamente a mesma (com a mesma maiúscula).
A saída é "Reset"
fonte
fonte
Maneira simples para iniciantes:
fonte