ใช้ C # เพื่อตรวจสอบว่าสตริงมีสตริงในอาร์เรย์สตริงหรือไม่


290

ฉันต้องการใช้ C # เพื่อตรวจสอบว่าค่าสตริงมีคำในอาร์เรย์สตริงหรือไม่ ตัวอย่างเช่น,

string stringToCheck = "text1text2text3";

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

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

}

ฉันจะตรวจสอบว่าค่าสตริงสำหรับ 'stringToCheck' มีคำในอาร์เรย์ได้อย่างไร


1
บล็อกนี้อ้างอิงเทคนิคมากมายสำหรับการทดสอบว่าสตริงมีสตริงหรือไม่: blogs.davelozinski.com/curiousconsultant/ …
Robert Harvey

คำตอบ:


145

นี่คือวิธีที่คุณสามารถทำได้:

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

UPDATE:อาจเป็นเพราะคุณกำลังมองหาทางออกที่ดีกว่า .. อ้างถึงคำตอบของ @Anton Gogolev ด้านล่างซึ่งใช้ประโยชน์จาก LINQ


3
ขอบคุณฉันเปลี่ยนรหัสของคุณเป็น: if (stringToCheck.Contains) และมันใช้งานได้
Theomax

5
ฉันทำถ้า (stringArray.Contains (stringToCheck)) และใช้งานได้ดีขอบคุณ
Tamara JQ

68
อย่าใช้คำตอบนี้ใช้ LINQ แทน
AlexC

11
โน้ตเล็ก ๆ น้อย ๆ ให้กับผู้ที่ไม่เห็นมีวิธีการในอาร์เรย์สตริง: ตรวจสอบว่าคุณมี "ใช้ System.Linq;" เนมสเปซใน codefile ของคุณ :)
Sudhanshu Mishra

5
Linq ไม่สามารถใช้ได้ในซอฟต์แวร์รุ่นเก่าเสมอไป
William Morrison

842

นี่คือวิธี:

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

การตรวจสอบนี้หากมีคนใดคนหนึ่งของสตริงจากstringToCheck stringArrayหากคุณต้องการให้แน่ใจว่ามันมีสารตั้งต้นทั้งหมดเปลี่ยนAnyเป็นAll:

if(stringArray.All(stringToCheck.Contains))

115
หมายเหตุตนเอง: linq วิเศษ, linq วิเศษ, linq วิเศษ! ต้องเริ่มใช้ linq
Fredrik Johansson

2
@Spooks Linq To Objects (ซึ่งใช้ในการตรวจสอบคำตอบของสตริง) สามารถใช้งานได้ผ่าน LinqBridge บน. NET 2.0 albahari.com/nutshell/linqbridge.aspx
David Rettenbacher

1
คุณจะทำสิ่งนี้อย่างไรกับค่าคงที่ของกรณี?
กระทำผิด

14
@Offler นั่นน่าจะเป็นstringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
Anton Gogolev

2
วิธีรับไอเท็มใดในอาเรย์ที่ตรงกัน?
ibubi

44

ลองสิ่งนี้:

ไม่จำเป็นต้องใช้ LINQ

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

ดี! Linq มีประโยชน์อะไรบ้างที่มีมากกว่า Array.IndexOf?
Heckflosse_230

21
นี่ไม่ได้แก้ปัญหาเลย IndexOf จะบอกคุณว่าอาร์เรย์มีการจับคู่ที่ตรงกันสำหรับสตริงหรือไม่คำถามเดิมคือถ้าสตริงมีหนึ่งในอาร์เรย์ของสตริงซึ่ง Linq จัดการได้อย่างง่ายดาย
NetMage

ฉันรู้ว่าความคิดเห็นนี้สาย แต่เพียงผู้ที่ไม่ทราบสตริงเป็นอาร์เรย์ของตัวอักษรดังนั้นประเภทสตริงจะมีวิธีการ IndexOf ... ดังนั้น @NetMage มันเป็นทางออกที่เป็นไปได้
Blacky Wolf

3
@ Blacklack Wolf คุณอ่านคำถามหรือไม่ Array.IndexOf แจ้งให้คุณทราบว่าอาร์เรย์มีค่าหรือไม่ OP ต้องการทราบว่าค่ามีสมาชิกใด ๆ ของอาร์เรย์หรือไม่ตรงข้ามกับคำตอบนี้ คุณสามารถใช้ String.IndexOf กับ Linq: stringArray.Any(w => stringToCheck.IndexOf(w) >= 0)แต่คำตอบของ Linq โดยใช้ String.Contains มีเหตุผลมากกว่านี้เพราะนั่นคือสิ่งที่ถูกถาม
NetMage

40

เพียงใช้วิธีการ linq:

stringArray.Contains(stringToCheck)

4
ทราบว่ามีเป็นวิธีการขยายและคุณต้องทำusing System.Linq;
isHuman

11
คำตอบนี้ย้อนกลับจากคำถาม
NetMage

2
คำตอบนี้ได้รับการปรับปรุงขึ้นหลายครั้งแล้วหรือยัง? 5 ปีหลังจากถามคำถามและวิธีการแก้ปัญหานั้นตรงกันข้ามกับคำถามที่ถาม
Fus Ro Dah

1
อาจจะแค่ผันกลับชื่อตัวแปรมันก็โอเค?
Jean-François Fabre

8

วิธีที่ง่ายที่สุดและตัวอย่าง

  bool bol=Array.Exists(stringarray,E => E == stringtocheck);

ดีกว่าคือ stringarray.Exists (เอนทิตี้ => เอนทิตี้ == stringtocheck)
Marcel Grüger

ฉันคิดว่าคุณไม่สามารถเรียกวิธีการที่มีอยู่โดยตรงจาก string array วิธีที่มีอยู่สามารถใช้โดยตรงสำหรับรายการ <T> ดังนั้นควรใช้วิธี array.exist วิธีคงที่ <T> สำหรับสตริง array.check ที่นี่ => msdn.microsoft.com/en- us / library / yw84x8be (v = vs.110) .aspx
Jze

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

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

2
ฉันไม่คิดว่านี่คือสิ่งที่คำถามต้องการ
ปาง

5

บางสิ่งเช่นนี้อาจจะ:

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

นี่เป็นวิธีที่ดีกว่าเนื่องจากเป็นการตรวจสอบสตริงย่อยกับคำในรายการแทนที่จะเป็นการตรวจสอบการจับคู่ที่ตรงกัน
รอย B

คำตอบที่ดี แต่ว้าวอ่านยากเทียบกับ C # ที่ทันสมัยแม้ไม่มี Linq; นอกจากนี้String.Containsอาจจะดีกว่าString.IndexOfถ้าคุณไม่ต้องการเพิกเฉยต่อกรณีเนื่องจาก Microsoft ลืมอาร์กิวเมนต์สองตัวที่String.Containsคุณต้องเขียนด้วยตัวคุณเอง พิจารณา:Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
NetMage

3

การใช้ Linq และกลุ่มเมธอดจะเป็นวิธีที่รวดเร็วและกะทัดรัดที่สุด

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

3

คุณสามารถกำหนดของคุณเองstring.ContainsAny()และstring.ContainsAll()วิธีการ ในฐานะโบนัสฉันยังเคยใช้string.Contains()วิธีที่ช่วยเปรียบเทียบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ฯลฯ

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

คุณสามารถทดสอบสิ่งเหล่านี้ด้วยรหัสต่อไปนี้:

    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

ฉันใช้สิ่งต่อไปนี้ในแอปพลิเคชันคอนโซลเพื่อตรวจสอบข้อโต้แย้ง

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


1

ลอง:

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

นอกจากนี้คุณยังสามารถทำสิ่งเดียวกับแอนตัน Gogolev แนะนำให้ตรวจสอบว่ารายการใด ๆในstringArray1ตรงกับรายการใด ๆในstringArray2:

if(stringArray1.Any(stringArray2.Contains))

และรายการทั้งหมดใน stringArray1 ก็เช่นเดียวกันกับรายการทั้งหมดใน stringArray2:

if(stringArray1.All(stringArray2.Contains))


0

ลองนี่ตัวอย่างต่อไปนี้: เพื่อตรวจสอบว่าฟิลด์มีคำใด ๆ ในอาร์เรย์หรือไม่ ในการตรวจสอบว่าฟิลด์ (someField) มีคำใด ๆ ในอาร์เรย์หรือไม่

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

ฉันใช้วิธีที่คล้ายกันกับ IndexOf โดย Maitrey684 และวนรอบ foreach ของ Theomax เพื่อสร้างสิ่งนี้ (หมายเหตุ: บรรทัด "สตริง" 3 รายการแรกเป็นเพียงตัวอย่างของวิธีที่คุณสามารถสร้างอาร์เรย์และนำไปใช้ในรูปแบบที่เหมาะสม)

ถ้าคุณต้องการเปรียบเทียบ 2 อาร์เรย์พวกมันจะคั่นด้วยเซมิโคลอน แต่ค่าสุดท้ายจะไม่มีหนึ่งหลังจากนั้น หากคุณต่อท้ายเซมิโคลอนในรูปแบบสตริงของอาร์เรย์ (เช่น a; b; c กลายเป็น; b; c;) คุณสามารถจับคู่โดยใช้ "x;" ไม่ว่าจะอยู่ในตำแหน่งใด:

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 ตั้งค่าเป็นจริงหากสตริงการค้นหาถูกจับคู่กับองค์ประกอบของอาร์เรย์ 'เส้น' ใด ๆ


0

ลองสิ่งนี้

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

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

มันจะกลับมาที่คุณพร้อมกับอุบัติการณ์แรกของข้อความที่คุณกำลังมองหา


0

หากstringArrayมีสตริงความยาวแปรผันจำนวนมากให้ลองใช้Trieเพื่อจัดเก็บและค้นหาอาร์เรย์สตริง

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

นี่คือการดำเนินการของTrieชั้นเรียน

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

หากสตริงทั้งหมดstringArrayมีความยาวเท่ากันคุณจะดีขึ้นเพียงแค่ใช้ a HashSetแทนTrie

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

ทางออกที่ง่ายไม่จำเป็นต้องใช้ linq ใด ๆ

String.Join (",", อาร์เรย์) .Contains (ค่า + ",");


2
เกิดอะไรขึ้นถ้าหนึ่งในค่าในอาร์เรย์มีตัวคั่นของคุณ
Tyler Benzing


0

ลองสิ่งนี้ไม่จำเป็นต้องมีลูป ..

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

}

0

เพื่อให้คำตอบข้างต้นเสร็จสมบูรณ์สำหรับIgnoreCaseตรวจสอบการใช้งาน:

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

มีวิธีใดที่จะได้ดัชนีการแข่งขันด้วยหรือไม่ ขอบคุณ
Si8

0

สำหรับกรณีของฉันคำตอบข้างต้นไม่ได้ผล ฉันกำลังตรวจสอบสตริงในอาร์เรย์และกำหนดให้เป็นค่าบูลีน ผมปรับเปลี่ยนคำตอบ @Anton Gogolev และออกAny()วิธีการและใส่stringToCheckภายในContains()วิธี

bool = stringArray.Contains(stringToCheck);


-1

ฉันใช้รหัสต่อไปนี้เพื่อตรวจสอบว่าสตริงมีรายการใด ๆ ในอาร์เรย์สตริงหรือไม่:

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

3
ชุดนี้Text = "matched"หลายครั้งตามที่มีสตริงของstringToCheck stringArrayคุณอาจต้องการวางbreakหรือreturnหลังการมอบหมาย
Dour High Arch

-1

แสดงให้เห็นถึงสามตัวเลือก ฉันชอบที่จะหาคนที่สามที่รัดกุมที่สุด

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

สองตัวเลือกที่สองของคุณไม่ได้ทำแบบเดียวกันในตอนแรก
Kyle Delaney
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.