Dizenin dize dizesinde bir dize içerip içermediğini kontrol etmek için C # kullanma


290

Bir dize değeri bir dize dizisinde bir kelime içerip içermediğini denetlemek için C # kullanmak istiyorum. Örneğin,

string stringToCheck = "text1text2text3";

string[] stringArray = { "text1", "someothertext", etc... };

if(stringToCheck.contains stringArray) //one of the items?
{

}

'StringToCheck' için dize değerinin dizide bir kelime içerip içermediğini nasıl kontrol edebilirim?


1
Bu blog, bir dizenin bir dize içerip içermediğini test etmek için sayısız tekniği karşılaştırır: blogs.davelozinski.com/curiousconsultant/…
Robert Harvey

Yanıtlar:


145

nasıl yapabileceğiniz aşağıda açıklanmıştır:

string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
    if (stringToCheck.Contains(x))
    {
        // Process...
    }
}

GÜNCELLEME: Belki daha iyi bir çözüm arıyorsanız .. @Anton Gogolev'in aşağıdaki LINQ'yu kullanan cevabına bakınız.


3
Teşekkürler, kodunuzu değiştirdim: if (stringToCheck.Contains (s)) ve işe yaradı.
Theomax

5
Eğer yaptım (stringArray.Contains (stringToCheck)) ve harika çalışıyor, teşekkürler.
Tamara JQ

68
Bu yanıtı kullanma yerine LINQ kullanın
AlexC

11
Dize dizisinde Contains yöntemini görmeyen kişilere küçük bir not : "using System.Linq;" dosya adınızdaki ad alanı :)
Mishra

5
Linq her zaman eski yazılımlarda mevcut değildir.
William Morrison

842

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

if(stringArray.Any(stringToCheck.Contains))
/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */

Bu stringToCheck, alt dizelerden herhangi birini içerip içermediğini denetler stringArray. Eğer tüm alt dizeleri içerdiğinden emin olmak istiyorsanız, değişim Anyiçin All:

if(stringArray.All(stringToCheck.Contains))

115
Kendine not: linq şaşırtıcı, linq şaşırtıcı, linq şaşırtıcı! Linq kullanmaya başlamalısın.
Fredrik Johansson

2
@Kitaplar Linq To Objects (yanıtın dize denetiminde kullanılır) .NET 2.0 üzerindeki LinqBridge aracılığıyla kullanılabilir albahari.com/nutshell/linqbridge.aspx
David Rettenbacher

1
bunu vaka değişmezliğiyle nasıl yapardınız?
Offler

14
@Offler Bu olurdustringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
Anton

2
dizideki hangi öğenin eşleştiğini nasıl öğrenebilirim?
ibubi

44

Bunu dene:

LINQ kullanmaya gerek yok

if (Array.IndexOf(array, Value) >= 0)
{
    //Your stuff goes here
}

Güzel! Ve Linq'in Array.IndexOf üzerinde ne gibi bir yararı olabilir?
Heckflosse_230

21
Bu, sorunu hiç çözmüyor. IndexOf, bir dizenin bir dize için tam eşleşme içerip içermediğini söyler, asıl soru, dize Linq'in kolayca işleyeceği dizelerden birini içeriyorsa sorudur.
NetMage

Bu yorum geç olduğunu biliyorum, ama sadece bilmeyenler için, bir dize karakter dizisidir böylece dize türleri bir IndexOf yöntemi içerir ... böylece @NetMage olası bir çözümdür.
Blacky Wolf

3
@Blacky Wolf, soruyu okudun mu? Array.IndexOf, bir dizinin bir değer içerip içermediğini söyler, OP, bir değerin bir dizinin herhangi bir üyesini içerip içermediğini, bu cevabın tam tersini bilmek ister. String.IndexOf'u Linq ile birlikte kullanabilirsiniz: stringArray.Any(w => stringToCheck.IndexOf(w) >= 0)ancak String.Contains kullanarak Linq yanıtı tam olarak ne istendiği gibi.
NetMage

40

Sadece linq yöntemini kullanın:

stringArray.Contains(stringToCheck)

4
Unutmayın, İçerir bir uzatma yöntemidir ve yapmanız gerekenusing System.Linq;
İnsan

11
Bu cevap sorudan geriye doğrudur.
NetMage

2
Bu cevap pek çok kez nasıl değerlendirildi? 5 yıl sonra soru sorulur ve çözüm temelde sorunun ne istediğini tersine çevrilir.
Fus Ro Dah

1
belki sadece değişken isimlerini tersine çevirir mi?
Jean-François Fabre


6
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

if (strNamesArray.Any(x => x == strName))
{
   // do some action here if true...
}

2
Sorunun sorduğu şeyin bu olduğunu sanmıyorum.
Pang

5

Belki böyle bir şey:

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) { 
    return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) {
    Console.WriteLine("Found!");
}

Tam eşleşme kontrolü yerine listedeki kelimelere karşı bir alt dize kontrolü olduğu için bu daha iyi bir çözümdür.
Roy B

Güzel cevap, ama wow modern C # ile karşılaştırıldığında okumak zor Linq olmadan bile; Ayrıca, String.Containsdaha iyi olabilir String.IndexOf, Microsoft iki argüman unuttum beri, bu vakayı görmezden istemedikçe String.Containskendi yazmak için var. Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
Şunu

3

Linq ve yöntem grubunu kullanmak bunu yapmanın en hızlı ve daha kompakt yolu olacaktır.

var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;

3

Kendiniz string.ContainsAny()ve string.ContainsAll()yöntemlerinizi tanımlayabilirsiniz . Bir bonus olarak, büyük / string.Contains()küçük harfe duyarlı olmayan karşılaştırmaya izin veren bir yöntem bile attım .

public static class Extensions
{
    public static bool Contains(this string source, string value, StringComparison comp)
    {
        return source.IndexOf(value, comp) > -1;
    }

    public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.Any(value => source.Contains(value, comp));
    }

    public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.All(value => source.Contains(value, comp));
    }
}

Bunları aşağıdaki kodla test edebilirsiniz:

    public static void TestExtensions()
    {
        string[] searchTerms = { "FOO", "BAR" };
        string[] documents = {
            "Hello foo bar",
            "Hello foo",
            "Hello"
        };

        foreach (var document in documents)
        {
            Console.WriteLine("Testing: {0}", document);
            Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine();
        }
    }

2

Bağımsız değişkenleri denetlemek için aşağıdakileri bir konsol uygulamasında kullanıyorum

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");

2

Linq kullanmak istiyorum ama yine de yapılabilir:

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);

1

Deneyin:

String[] val = { "helloword1", "orange", "grape", "pear" };
String sep = "";
string stringToCheck = "word1";

bool match = String.Join(sep,val).Contains(stringToCheck);
bool anothermatch = val.Any(s => s.Contains(stringToCheck));

1

Anton Gogolev olmadığını kontrol etmek anlaşılacağı gibi Ayrıca aynı şeyi yapabilir herhangi bir öğe içinde stringArray1eşleşen herhangi bir öğeyi içinde stringArray2:

if(stringArray1.Any(stringArray2.Contains))

Ve aynı şekilde tüm öğeleri stringArray1 eşleştirmek tüm öğeleri stringArray2 içinde:

if(stringArray1.All(stringArray2.Contains))


0

Bunu deneyin, işte örnek: Alanın dizideki kelimelerden herhangi birini içerip içermediğini kontrol etmek için. Alanın (someField) dizideki kelimelerden herhangi birini içerip içermediğini kontrol etmek için.

String[] val = { "helloword1", "orange", "grape", "pear" };   

Expression<Func<Item, bool>> someFieldFilter = i => true;

someFieldFilter = i => val.Any(s => i.someField.Contains(s));

0
public bool ContainAnyOf(string word, string[] array) 
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (word.Contains(array[i]))
            {
                return true;
            }
        }
        return false;
    }

0

Bunu oluşturmak için Maitrey684 tarafından IndexOf ve Theomax'ın foreach döngüsüne benzer bir yöntem kullandım. (Not: ilk 3 "dize" satırı, bir diziyi nasıl oluşturabileceğinize ve onu doğru biçime nasıl alabileceğinize bir örnektir).

2 diziyi karşılaştırmak isterseniz, bunlar noktalı virgülle sınırlandırılacaktır, ancak son değerin bundan sonra bir tane olmayacaktır. Dizinin dize biçimine bir noktalı virgül eklerseniz (yani a; b; c a; b; c; olur), "x;" hangi konumda olursa olsun:

bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";

foreach (string s in otherArray)
{
    if (myStringArray.IndexOf(s + ";") != -1) {
       found = true;
       break;
    }
}

if (found == true) { 
    // ....
}

0
string [] lines = {"text1", "text2", "etc"};

bool bFound = lines.Any(x => x == "Your string to be searched");

bFound, aranan dize 'satır' dizisinin herhangi bir öğesiyle eşleşirse true olarak ayarlanır.


0

Bunu dene

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };

var t = lines.ToList().Find(c => c.Contains(stringToCheck));

Aradığınız metnin ilk insidansını içeren çizgiyi döndürür.


0

Eğer stringArraydeğişik uzunluktaki dizeleri çok sayıda içerir, bir kullanma düşünün TRIE saklamak ve dize dizisi arayın.

public static class Extensions
{
    public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
    {
        Trie trie = new Trie(stringArray);
        for (int i = 0; i < stringToCheck.Length; ++i)
        {
            if (trie.MatchesPrefix(stringToCheck.Substring(i)))
            {
                return true;
            }
        }

        return false;
    }
}

İşte Triesınıfın uygulanması

public class Trie
{
    public Trie(IEnumerable<string> words)
    {
        Root = new Node { Letter = '\0' };
        foreach (string word in words)
        {
            this.Insert(word);
        }
    }

    public bool MatchesPrefix(string sentence)
    {
        if (sentence == null)
        {
            return false;
        }

        Node current = Root;
        foreach (char letter in sentence)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
                if (current.IsWord)
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }

        return false;
    }

    private void Insert(string word)
    {
        if (word == null)
        {
            throw new ArgumentNullException();
        }

        Node current = Root;
        foreach (char letter in word)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
            }
            else
            {
                Node newNode = new Node { Letter = letter };
                current.Links.Add(letter, newNode);
                current = newNode;
            }
        }

        current.IsWord = true;
    }

    private class Node
    {
        public char Letter;
        public SortedList<char, Node> Links = new SortedList<char, Node>();
        public bool IsWord;
    }

    private Node Root;
}

Tüm dizeleri ise stringArrayaynı uzunlukta, sadece bir kullanan daha iyi durumda olacaktır HashSetyerine aTrie

public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
    int stringLength = stringArray.First().Length;
    HashSet<string> stringSet = new HashSet<string>(stringArray);
    for (int i = 0; i < stringToCheck.Length - stringLength; ++i)
    {
        if (stringSet.Contains(stringToCheck.Substring(i, stringLength)))
        {
            return true;
        }
    }

    return false;
}

0

Basit çözüm, gerekli değildir

String.Join (",", dizi) .Contains (Value + ",");


2
Dizideki değerlerden biri sınırlayıcınızı içeriyorsa ne olur?
Tyler Benzing

0
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);

0

Bunu deneyin, bir döngüye gerek yok ..

string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{

}

0

Yukarıdaki cevapları tamamlamak için IgnoreCase kontrolünü kullanın:

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)

Bununla maçın indeksini almanın herhangi bir yolu var mı? Teşekkürler.
Si8

0

Benim durumum için, yukarıdaki cevaplar işe yaramadı. Ben bir dizede bir dize için kontrol ve bir boolean değerine atama. @Anton Gogolev'in cevabını değiştirdim ve Any()yöntemi kaldırdım ve metodun stringToCheckiçine koydum Contains().

bool = stringArray.Contains(stringToCheck);

0

Array sınıfının Find veya FindIndex yöntemlerini kullanarak :

if(Array.Find(stringArray, stringToCheck.Contains) != null) 
{ 
}
if(Array.FindIndex(stringArray, stringToCheck.Contains) != -1) 
{ 
}

-1

Dize dize dizisindeki öğelerden herhangi birini içerip içermediğini kontrol etmek için aşağıdaki kodu kullandım:

foreach (string s in stringArray)
{
    if (s != "")
    {
        if (stringToCheck.Contains(s))
        {
            Text = "matched";
        }
    }
}

3
Bu , öğesinin alt dizelerini içerdiği Text = "matched"kadar çok stringToCheckayar yapar stringArray. Ödeve bir breakveya returnsonra koymak isteyebilirsiniz .
Dour Yüksek Kemeri

-1

Üç seçenek gösterilmiştir. En özlü olarak üçüncüyü bulmayı tercih ederim.

class Program {
    static void Main(string[] args) {
    string req = "PUT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.A");  // IS TRUE
    }
    req = "XPUT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.B"); // IS TRUE
    }
    req = "PUTX";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.C");  // IS TRUE
    }
    req = "UT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.D"); // false
    }
    req = "PU";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.E"); // false
    }
    req = "POST";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("two.1.A"); // IS TRUE
    }
    req = "ASD";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("three.1.A");  // false
    }


    Console.WriteLine("-----");
    req = "PUT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.A"); // IS TRUE
    }
    req = "XPUT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.B"); // false
    }
    req = "PUTX";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.C"); // false
    }
    req = "UT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.D"); // false
    }
    req = "PU";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.E"); // false
    }
    req = "POST";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("two.2.A");  // IS TRUE
    }
    req = "ASD";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("three.2.A");  // false
    }

    Console.WriteLine("-----");
    req = "PUT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.A"); // IS TRUE
    }
    req = "XPUT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.B");  // false
    }
    req = "PUTX";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.C");  // false
    }
    req = "UT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.D");  // false
    }
    req = "PU";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.E");  // false
    }
    req = "POST";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("two.3.A");  // IS TRUE
    }
    req = "ASD";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("three.3.A");  // false
    }

    Console.ReadKey();
    }
}

İkinci iki seçeneğiniz de ilkinde aynı şeyi yapmıyor.
Kyle Delaney
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.