Case ləzzət "İçərisində (string)"

Növbəti qaytarmağı doğru etmək üçün bir yol varmı?

 string title = "ASTRINGTOTEST"; title.Contains("string"); 

Göründüyü kimi, həcm həssaslığını təyin etməyə imkan verən heç bir yük yoxdur. Hal-hazırda mən də bunları bir-birinə qatıram, amma bu yalnız axmaqdır (yuxarı və aşağı bədən ilə gələn i18n problemləri ilə mən deməkdir).

ƏLAVƏ OLUNUB
Bu qədim bir sual, və o vaxtdan bəri mən tamamilə öyrənmək istəyirsinizsə çox geniş və çətin bir mövzuya sadə bir cavab istəmişəm.
Çox hallarda, mono dilində, İngilis dili kodu bazasında bu cavab kifayətdir. Bura gələn insanların çoxu bu kateqoriyaya düşdüyünü şübhə edirəm, bu ən məşhur cavabdır.
Bununla birlikdə, bu cavab hər hansı bir mətnin eyni mədəniyyət olduğunu bildiyimiz qədər nəzərə almadan mətn dəftərini müqayisə edə bilməyəcəyimiz bir problem doğurur və biz bunun nə mədəniyyət olduğunu bilirik. Bu bəlkə də daha az populyar bir cavabdır, amma hesab edirəm ki, bu daha doğrudur və buna görə də onu qeyd etdiyim kimi.

2534
15 янв. Boris Callens tərəfindən 15 Yanvar verildi 2009-01-15 00:39 '09 da 0:39 'da 2009-01-15 00:39' da
@ 24 cavab

paragraph simvolu word stringini ehtiva etdiyini yoxlamaq üçün (@QuarterMeister sayəsində)

 culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0 

culture mətnin yazıldığı dili təsvir edən CultureInfo nümunəsidir.

Bu həll, dil bağlılığından başqa, vəziyyətin həssaslığının tərifinə şəffafdır. Məsələn, İngilis dili II simvolları dokuzuncu məktubun yuxarı və aşağı versiyaları üçün istifadə edir, Türk isə bu simvolları 29-məktub əlifbasının on birinci və on ikinci hərfləri üçün istifadə edir. Üstünlükdə "i" in Türk versiyası tanımadığı bir xarakterdir "İ".

Beləliklə, tintin xəttləri ingilis dilində eyni sözdür, lakin türkdəki müxtəlif sözlərdir. Anladığım qədər, biri "ruh", digəri isə "imitasiya" deməkdir. (Türklər, mən səhv olduğum halda məni düzəltməyin və ya ən yaxşı nümunəni göstərməyin)

Yekunlaşdırmaq üçün, mətnin hansı dildə olduğunu bilsəniz, "bu iki xətt eyni, lakin müxtəlif hallarda" sualına cavab verə bilərsiniz. Bilmirsinizsə, siz punt almaq məcburiyyətindəsiniz. Proqramda ingilis hegemonyasını nəzərə alaraq, yəqin ki, CultureInfo.InvariantCulture müraciət etməlisiniz, çünki bu, dostluqla yanlış olacaqdır.

1166
17 марта '13 в 21:22 2013-03-17 21:22 Polkovnik Panik 17 mart 'da 21:22' də cavab verilir

String.IndexOf metodundan istifadə edə və StringComparison.OrdinalIgnoreCase dən axtarış növü kimi istifadə edə bilərsiniz:

 string title = "STRING"; bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0; 

String üçün yeni bir uzantı metodunu müəyyən etmək daha yaxşıdır:

 public static class StringExtensions { public static bool Contains(this string source, string toCheck, StringComparison comp) { return source?.IndexOf(toCheck, comp) >= 0; } } 
border=0

Sıfır yayıldığını unutmayın ?. C # 6.0-dan (VS 2015), köhnə versiyalar üçün mövcuddur

 if (source == null) return false; return source.IndexOf(toCheck, comp) >= 0; 

TƏTBİQ:

 string title = "STRING"; bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase); 
2439
15 янв. Cavab JaredPar tərəfindən 15 Yanvar verildi 2009-01-15 00:44 '09 da 0:44 'da 2009-01-15 00:44

IndexOf() aşağıdakı kimi istifadə edə bilərsiniz:

 string title = "STRING"; if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1) { // The string exists in the original } 

0 (sıfır) bir indeks ola bildiyindən, siz 1-i yoxlayın. Gedin

MSDN

İndeksin dəyəri, bu sətri tapsaydı, null dəyərə əsaslansa və ya -1 olmasaydı. Bu dəyər String.Empty, return dəyəri 0-dir.

209
15 янв. Cavab mkchandler yanvar 15 verilir 2009-01-15 00:48 '09 at 0:48 2009-01-15 00:48

Regex istifadə edərək alternativ həlli:

 bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase); 
118
28 июля '10 в 20:18 2010-07-28 20:18 Cavab 28 iyul 2010-cu il saat 20:18 tarixində Jed tərəfindən verilmişdir 2010-07-28 20:18

Həmişə yalnız xətləri aşağı çevirə bilərsiniz.

 string title = "string": title.ToUpper().Contains("STRING") // returns true 

Oh, bu son biti gördüm. Case incensitivity t21, yəqin ki * ilə eyni olmazdı və əgər performans bir problem deyilsə, məncə kapital surətlərinin çıxarılması və müqayisə edilməsi ilə bağlı bir problem görmürəm. Bir dəfə bir halda gördüm ki, baş verən hadisədən xəbərsiz ...

67
15 янв. cənab Ed S. tərəfindən verilir 2009-01-15 00:42 '09 da 0:42 'da 2009-01-15 00:42

Cavabla əlaqədar problemlərdən biri, simli boş olduqda bir istisna atmasıdır. Bunu bunu yoxlamaq üçün əlavə edə bilərsiniz:

 public static bool Contains(this string source, string toCheck, StringComparison comp) { if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source)) return true; return source.IndexOf(toCheck, comp) >= 0; } 
48
08 дек. Cavab FeiBao 豹 豹 08 dekabr tərəfindən verilir . 2010-12-08 00:11 '10 at 0:11 2010-12-08 00:11

StringExtension sinfi irəli bir yoldur, tam bir kod nümunəsi vermək üçün yuxarıda bir neçə mesaj əlavə etdim:

 public static class StringExtensions { /// <summary> /// Allows case insensitive checks /// </summary> public static bool Contains(this string source, string toCheck, StringComparison comp) { return source.IndexOf(toCheck, comp) >= 0; } } 
34
18 нояб. Cavab 18 noyabr tarixində Andrew tərəfindən verilir. 2010-11-18 19:48 '10 at 19:48 2010-11-18 19:48

Təmiz və sadədir.

 Regex.IsMatch(file, fileNamestr, RegexOptions.IgnoreCase) 
33
09 нояб. cavab verildi takirala 09 Noyabr. 2012-11-09 07:25 '12 at 7:25 2012-11-09 07:25

OrdinalIgnoreCase, CurrentCultureIgnoreCase və ya InvariantCultureIgnoreCase?

Bu kifayət deyil, burada istifadə etmək üçün bəzi qaydalar aşağıdakılardır:

Dos

  • Müqayisə üçün StringComparison.OrdinalIgnoreCase istifadə StringComparison.OrdinalIgnoreCase mədəniyyətlər və agnostics arasında müqayisə üçün təhlükəsizdir.
  • Sürəti artırmaq üçün StringComparison.OrdinalIgnoreCase müqayisə istifadə edin.
  • Bir istifadəçiyə çıxış göstərərkən StringComparison.CurrentCulture-based simli əməliyyatlardan istifadə edin.
  • Linqvistik olmayan StringComparison.Ordinal və ya StringComparison.OrdinalIgnoreCase istifadə etmək üçün mədəni invariant əsasında StringComparison.Ordinal əməliyyatlarının mövcud istifadə StringComparison.OrdinalIgnoreCase , müqayisədə linqvistik əhəmiyyətsiz (məsələn, simvolik).
  • Müqayisə üçün ToLowerInvariant normallaşdıranda ToLowerInvariant , ToLowerInvariant deyil.

Əxlaq

  • Daş dövrü əməliyyatları üçün aşırı yüklənmələrdən istifadə edin.
  • StringComparison.InvariantCulture əsaslı StringComparison.InvariantCulture istifadə edin
    çox hallarda əməliyyatlar; bir neçə istisnalardan biri linqvistik cəhətdən əhəmiyyətli, lakin qalan mədəni-agnostik məlumatlar olacaqdır.

Bu qaydalara əsasən istifadə etməlisiniz:

 string title = "STRING"; if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1) { // The string exists in the original } 

[YourCecision] yuxarıda göstərilən tövsiyələrdən asılıdır.

source link: http://msdn.microsoft.com/en-us/library/ms973919.aspx

24
17 июня '14 в 13:31 2014-06-17 13:31 Cavab Fabian Bigler 17 iyun 'da 13:31' də verildi 2014-06-17 13:31

Eynilə:

 string s="AbcdEf"; if(s.ToLower().Contains("def")) { Console.WriteLine("yes"); } 
11
13 июля '14 в 12:54 2014-07-13 12:54 cdytoby cavab 13 iyul 2014 , 12:54 2014-07-13 12:54 verilir

Budur ki, bu C # deyil, çərçivədə (VB.NET) artıq belə bir funksiya var

 Dim str As String = "UPPERlower" Dim b As Boolean = InStr(str, "UpperLower") 

Seçim C #:

 string myString = "Hello World"; bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world"); 
10
09 сент. cavab serhio 09 sep verilir . 2011-09-09 16:23 '11 'da 16:23' də 2011-09-09 16:23

InStr VisualBasic qurğusundan InStr metodu InStr (və ya onu yenidən təyin edə bilərsiniz). Buna baxarkən, dotNeetPeek göstərir ki, yalnız başlıqları və kiçik harfləri nəzərə almır, həm də kana tipi və tam yarım eni simvolları üçün (əsasən Asiya dillərinə aiddir, baxmayaraq ki, latın əlifbasının tam versiyasını da var). Mən bəzi detalları atlayacağam, lakin ŞəxsiInStrText xüsusi metoduna baxın:

 private static int InternalInStrText(int lStartPos, string sSrc, string sFind) { int num = sSrc == null ? 0 : sSrc.Length; if (lStartPos > num || num == 0) return -1; if (sFind == null || sFind.Length == 0) return lStartPos; else return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth); } 
10
06 дек. Casey tərəfindən verilmiş cavab 06 Dek 2013-12-06 17:11 '13 at 17:11 2013-12-06 17:11

Bunu istifadə edin:

 string.Compare("string", "STRING", new System.Globalization.CultureInfo("en-US"), System.Globalization.CompareOptions.IgnoreCase); 
9
11 июля '11 в 10:53 2011-07-11 10:53 Cavab mr.martan tərəfindən 11 iyul 11:11 'də verildi 2011-07-11 10:53

Nəticədə ümumi əməliyyat "ehtiva edir" belə bir funksiyaya salınır

 /// <summary> /// Determines whether the source contains the sequence. /// </summary> /// <typeparam name="T">The type of the items in the sequences.</typeparam> /// <param name="sourceEnumerator">The source enumerator.</param> /// <param name="sequenceEnumerator">The sequence enumerator.</param> /// <param name="equalityComparer">An equality comparer.</param> /// <remarks> /// An empty sequence will return <c>true</c>. /// The sequence must support <see cref="IEnumerator.Reset"/> /// if it does not begin the source. /// </remarks> /// <returns> /// <c>true</c> if the source contains the sequence; /// otherwise <c>false</c>. /// </returns> public static bool Contains<T>( IEnumerator<T> sourceEnumerator, IEnumerator<T> sequenceEnumerator, IEqualityComparer<T> equalityComparer) { if (equalityComparer == null) { equalityComparer = EqualityComparer<T>.Default; } while (sequenceEnumerator.MoveNext()) { if (sourceEnumerator.MoveNext()) { if (!equalityComparer.Equals( sourceEnumerator.Current, sequenceEnumerator.Current)) { sequenceEnumerator.Reset(); } } else { return false; } } return true; } 

bu kimi bir IEnumerable edir uzadılması bir versiyası trivially sarılı bilər,

 public static bool Contains<T>( this IEnumerable<T> source, IEnumerable<T> sequence, IEqualityComparer<T> equalityComparer = null) { if (sequence == null) { throw new ArgumentNullException("sequence"); } using(var sequenceEnumerator = sequence.GetEnumerator()) using(var sourceEnumerator = source.GetEnumerator()) { return Contains( sourceEnumerator, sequenceEnumerator, equalityComparer); } } 

Bu, string daxil olmaqla, hər hansı bir sıra ardıcıl müqayisə üçün işləyəcək, çünki string bir IEnumerable<char> tətbiq edir,

 // The optional parameter ensures the generic overload is invoked // not the string.Contains() implementation. "testable".Contains("est", EqualityComparer<char>.Default) 

Bildiyiniz kimi, strings ümumi deyil, onlar ixtisaslaşmışdır. Oyunda iki əsas amil var.

  • Dildən asılı olaraq, müxtəlif hallarda olan "gövdə" problemi.
  • Çox mürəkkəb bir problem "mətn elementləri" (məktublar / nömrələr / simvollar və s.) Dəstinin Unicode kod nöqtələri ilə necə təmsil olunduğunu və hansı real simvolların müəyyən bir simli təmsil edə biləcəyindən ibarətdir, detallar bu cavablara genişlənir.

Xalis təsir eynidır. Mübahisə edə biləcək sətirlər linguistically bərabərdir, kifayət qədər simvolların müxtəlif kombinasiyaları ilə təmsil edilə bilər. Bundan başqa, həqiqət qaydaları mədəniyyətlər arasında dəyişir.

Bütün bunlar, bununla əlaqədar olaraq "Contains" əsasında xüsusi bir düsturun həyata keçirilməsinə gətirib çıxarır.

 using System.Globalization; public static bool Contains( this string source, string value, CultureInfo culture = null, CompareOptions options = CompareOptions.None) { if (value == null) { throw new ArgumentNullException("value"); } var compareInfo = culture == null ? CultureInfo.CurrentCulture.CompareInfo : culture.CompareInfo; var sourceEnumerator = StringInfo.GetTextElementEnumerator(source); var sequenceEnumerator = StringInfo.GetTextElementEnumerator(value); while (sequenceEnumerator.MoveNext()) { if (sourceEnumerator.MoveNext()) { if (!(compareInfo.Compare( sourceEnumerator.Current, sequenceEnumerator.Current, options) == 0)) { sequenceEnumerator.Reset(); } } else { return false; } } return true; } 

Bu funksiya strings normalizasiyasından asılı olmayaraq işləyəcək işi həssas olmayan mədəniyyətə özgü "tərkibində" yerinə yetirmək üçün istifadə edilə bilər. məsələn.

 "testable".Contains("EST", StringComparer.CurrentCultureIgnoreCase) 
8
03 дек. Cavab Jodrell 03 dekabr tərəfindən verilir . 2014-12-03 18:50 '14 saat 18:50 'də 2014-12-03 18:50

Bunlar ən asan həllərdir.

  1. İndeksə görə

     string title = "STRING"; if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1) { // contains } 
  2. Davanın dəyişdirilməsi

     string title = "STRING"; bool contains = title.ToLower().Contains("string") 
  3. Regex ilə

     Regex.IsMatch(title, "string", RegexOptions.IgnoreCase); 
6
12 июля '18 в 12:25 2018-07-12 12:25 Cavab LAV VISHWAKARMA 12 İyul, '18 'saat 12:25 2018-07-12 12:25' də verilir

RegEx'i istifadə etmək birbaşa yoludur:

 Regex.IsMatch(title, "string", RegexOptions.IgnoreCase); 
6
18 сент. Cavab 18 sentyabr Standına verilir . 2013-09-18 16:08 '13 'da 16:08' da 2013-09-18 16:08

Burada başqa bir nümunə çox bənzəyir, amma bool üçün enumun sadələşdirilməsinə qərar verdim, çünki digər alternativlər adətən lazım deyildir. Mənim nümunəm:

 public static class StringExtensions { public static bool Contains(this string source, string toCheck, bool bCaseInsensitive ) { return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0; } } 

Və istifadə kimi bir şeydir:

 if( "main String substring".Contains("SUBSTRING", true) ) .... 
5
17 окт. cavab 17 oktyabr TarmoPikaro verilir . 2015-10-17 10:46 '15 at 10:46 2015-10-17 10:46

Yalnızca .NET Core 2. 0+ (indi üçün)

.Net Core 2.0 versiyasından bu problemi həll etmək üçün bir neçə üsula malikdir:

  • String.Contains (Char, StringComparison )
  • String.Contains (String, StringComparison )

Məsələn:

 "Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase); 

Vaxt keçdikcə, onlar .NET standartına və oradan baz sinif kitabxanasının bütün digər tətbiqlərinə keçəcəklər.

3
13 окт. 13 oktyabrda Mathieu Renda tərəfindən cavab verildi 2018-10-13 12:26 '18 saat 12:26 'də 2018-10-13 12:26

Burada hiylə işi məhdudlaşdırmaqla bir simli axtarış etməkdir, amma eyni qaydada eyni saxlayır.

  var s="Factory Reset"; var txt="reset"; int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length; var subString = s.Substring(first - txt.Length, txt.Length); 

"Sıfırlama"

2
03 мая '16 в 17:36 2016-05-03 17:36 Cavab Bb 03 may '16 saat 17: 36-dək 2016-05-03 17:36

string.indexof () funksiyasından istifadə edə bilərsiniz. Bu vəziyyət laqeyd qalacaq.

2
11 дек. Cavab Okan SARICA tərəfindən verilir 11 dekabr. 2016-12-11 16:39 '16 saat 16:39 'da 2016-12-11 16:39
 if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;} 
2
26 окт. Cavab Tamilselvan K 26 okta verilir . 2016-10-26 17:34 '16 'da 5:34 ' də 2016-10-26 17:34 'da

simli bir simli olub olmadığını yoxlamaq istəyirsinizsə, bunu etmək üçün asan bir yol var.

 string yourStringForCheck= "abc"; string stringInWhichWeCheck= "Test abc abc"; bool isContaines = stringInWhichWeCheck.ToLower().IndexOf(yourStringForCheck.ToLower()) > -1; This boolean value will return if string contains or not 
0
16 нояб. cavab şaişav şukla 16 noyabr. 2017-11-16 15:23 '17 də 3:23 PM 2017-11-16 15:23
 public static class StringExtension { #region Public Methods public static bool ExContains(this string fullText, string value) { return ExIndexOf(fullText, value) > -1; } public static bool ExEquals(this string text, string textToCompare) { return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase); } public static bool ExHasAllEquals(this string text, params string[] textArgs) { for (int index = 0; index < textArgs.Length; index++) if (ExEquals(text, textArgs[index]) == false) return false; return true; } public static bool ExHasEquals(this string text, params string[] textArgs) { for (int index = 0; index < textArgs.Length; index++) if (ExEquals(text, textArgs[index])) return true; return false; } public static bool ExHasNoEquals(this string text, params string[] textArgs) { return ExHasEquals(text, textArgs) == false; } public static bool ExHasNotAllEquals(this string text, params string[] textArgs) { for (int index = 0; index < textArgs.Length; index++) if (ExEquals(text, textArgs[index])) return false; return true; } /// <summary> /// Reports the zero-based index of the first occurrence of the specified string /// in the current System.String object using StringComparison.InvariantCultureIgnoreCase. /// A parameter specifies the type of search to use for the specified string. /// </summary> /// <param name="fullText"> /// The string to search inside. /// </param> /// <param name="value"> /// The string to seek. /// </param> /// <returns> /// The index position of the value parameter if that string is found, or -1 if it /// is not. If value is System.String.Empty, the return value is 0. /// </returns> /// <exception cref="ArgumentNullException"> /// fullText or value is null. /// </exception> public static int ExIndexOf(this string fullText, string value) { return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase); } public static bool ExNotEquals(this string text, string textToCompare) { return ExEquals(text, textToCompare) == false; } #endregion Public Methods } 
0
14 июня '17 в 6:16 2017-06-14 06:16 cənnət cənnəti 14 iyun '17 'də saat 6:16' də 2017-06-14 06:16 ' də cavab verdi

Yeni başlayanlar üçün asan yol:

 title.ToLower().Contains("string");//of course "string" is lowercase. 
-4
17 апр. Cavab verilib O Thạnh Ldt 17 Apr 2017-04-17 11:04 '17 at 11:04 2017-04-17 11:04

bağlı digər suallar və ya sual