การตรวจสอบว่าอาร์เรย์สตริงมีค่าหรือไม่หากได้รับตำแหน่ง


163

ฉันมีอาร์เรย์สตริงนี้:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

ฉันต้องการที่จะตรวจสอบว่ามีstringArray valueถ้าเป็นเช่นนั้นฉันต้องการค้นหาตำแหน่งในอาร์เรย์

ฉันไม่ต้องการใช้ลูป ใครช่วยแนะนำฉันว่าฉันจะทำอย่างไร

คำตอบ:


317

คุณสามารถใช้วิธีArray.IndexOf :

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}

1
... และฉันใช้ foreach มาหลายเดือนแล้ว BTW คำนวณได้เร็วกว่าคำตอบของ BLUEPIXY หรือไม่ หรือช้ากว่า
Max von Hippel

2
ไม่Array.IndexOfเกี่ยวกับการดูแลเงินทุนของ บริษัท ? ไม่"text1" == "TEXT1"?
ปีศาจ

Array.IndexOfผลตอบแทน−1เฉพาะในกรณีที่ดัชนีเป็น 0 จำกัด กรณีนี้จะผิดพลาดโปรดระวัง! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia

สิ่งนี้มีประโยชน์หากคุณกำลังมองหาคู่ที่ตรงกัน อย่างไรก็ตามสิ่งนี้อาจมีประโยชน์หากคุณไม่สนใจเรื่องตัวพิมพ์เล็ก: วิธีเพิ่มตัวเลือกแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ให้กับ Array.IndexOf
Kyle Champion

72
var index = Array.FindIndex(stringArray, x => x == value)

7
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเพราะมันอนุญาตให้คนหนึ่งผ่านแลมบ์ดาทำสิ่งที่ซับซ้อนกว่าเช่น Array.FindIndex (อาร์เรย์, x => x.StartsWith ("ใส่สตริงที่นี่"))
reggaeguitar

1
แต่นั่นไม่ใช่คำถามที่ถาม คำถามถามว่าคุณจะหาค่าที่รู้จักจากอาร์เรย์ได้อย่างไร
Karl Gjertsen

2
@KarlGjertsen ฉันต้องการค้นหาตำแหน่งในอาร์เรย์
BLUEPIXY

สิ่งนี้มีประโยชน์มาก แต่การที่สามารถทำบางสิ่งเช่น x.ToUpper () นั้นค่อนข้างมีประโยชน์สำหรับฉัน
mrshickadance

31

เรายังสามารถใช้Exists:

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

1
คำตอบที่สะอาดและเรียบง่าย
Aryan Firouzian

ฉันจะตรวจสอบค่าแต่ละค่าได้อย่างไร เมื่อฉันลองตรวจสอบถ่านสำหรับถ่านฉันได้รับข้อความที่charไม่สามารถแปลงเป็นSystem.Predicate<char>
Aaron Franke

13

แก้ไข: ฉันไม่ได้สังเกตเห็นว่าคุณต้องการตำแหน่งเช่นกัน คุณไม่สามารถใช้IndexOfกับประเภทอาร์เรย์ได้โดยตรงเนื่องจากมีการใช้งานอย่างชัดเจน อย่างไรก็ตามคุณสามารถใช้:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(นี่คล้ายกับการโทรArray.IndexOfตามคำตอบของดาริน - เป็นเพียงแนวทางอื่นมันไม่ชัดเจนสำหรับฉันว่าทำไมจึงมีการใช้งานในอาร์เรย์อย่างชัดเจน แต่ไม่เป็นไร ... )IList<T>.IndexOf


ฉันจะค้นหาความครอบครองของโลกในอาเรย์ที่ใช้มีได้อย่างไร
MoShe

มีความเป็นไปได้ที่จะตรวจสอบไอเท็มสตริงในสตริงอาเรย์ A ที่มีอยู่ในสตริงอาเรย์อื่น B ​​หรือไม่?
Murali Murugesan

@MuraliMurugesan: มันไม่ชัดเจนสิ่งที่คุณขอ - ไม่ว่าจะเป็นสองอาร์เรย์มีใด ๆรายการที่เหมือนกัน? หนึ่งที่เฉพาะเจาะจงรายการที่(ในกรณีหลังความจริงที่ว่ามันยังอยู่ในอาเรย์นั้นไม่เกี่ยวข้องด้วย)
Jon Skeet

ฉันพยายามตอบที่นี่stackoverflow.com/a/22812525/1559213 stackoverflow.com/a/22812525/1559213ฉันขีดเพื่อส่งคืนจริง / เท็จสำหรับบรรทัด Html.CheckBox อันที่จริงมีอาร์เรย์เดือนและรูปแบบที่มีบางเดือน ถ้า Model เดือนมีอยู่ในอาร์เรย์เดือนเราต้องกลับจริง ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว :)
Murali Murugesan

@MuraliMurugesan: ดูเหมือนว่าif (months.Contains(model.Month))
Jon Skeet

5

คุณสามารถใช้Array.IndexOf()- โปรดทราบว่ามันจะกลับ -1 ถ้าไม่พบองค์ประกอบและคุณต้องจัดการกรณีนี้

int index = Array.IndexOf(stringArray, value);

4

คุณสามารถลองเช่นนี้ ... คุณสามารถใช้ Array.IndexOf () ถ้าคุณต้องการทราบตำแหน่งด้วย

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

3

IMO วิธีที่ดีที่สุดในการตรวจสอบว่าอาร์เรย์มีค่าที่กำหนดคือการใช้System.Collections.Generic.IList<T>.Contains(T item)วิธีการดังต่อไปนี้:

((IList<string>)stringArray).Contains(value)

ตัวอย่างโค้ดแบบสมบูรณ์:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[]อาร์เรย์ใช้วิธีสองสามอย่างของList<T>ส่วนตัวเช่นนับและประกอบด้วย เนื่องจากเป็นการใช้งานที่ชัดเจน (ส่วนตัว) คุณจะไม่สามารถใช้วิธีการเหล่านี้ได้หากไม่ส่งอาร์เรย์ก่อน สิ่งนี้ใช้ไม่ได้กับสตริงเท่านั้น - คุณสามารถใช้เคล็ดลับนี้เพื่อตรวจสอบว่าอาร์เรย์ประเภทใด ๆ มีองค์ประกอบใด ๆ หรือไม่ตราบใดที่องค์ประกอบของคลาสนั้นใช้ IComparable

โปรดทราบว่าIList<T>วิธีการทั้งหมดไม่ทำงานด้วยวิธีนี้ การพยายามใช้IList<T>วิธีเพิ่มในอาร์เรย์จะล้มเหลว


2
คุณเป็นคำตอบเดียวกับ Priyank มันไม่ได้ให้ดัชนีขององค์ประกอบซึ่งเป็นสิ่งที่ OP ต้องการ
reggaeguitar

@reggaeguitar เห็นด้วยกับคุณที่นั่น!
Si8

มันเป็นคำตอบที่ฉันกำลังมองหาแม้ว่ามันจะไม่ได้ตอบคำถามทั้งหมด
Auspex

1

คุณสามารถลองสิ่งนี้ค้นหาดัชนีที่มีองค์ประกอบนี้และตั้งค่าหมายเลขดัชนีเป็น int จากนั้นจะตรวจสอบว่า int นั้นมากกว่า -1 หรือไม่ดังนั้นถ้าเป็น 0 หรือมากกว่านั่นหมายความว่าพบเช่นนั้น ดัชนี - ตามอาร์เรย์เป็น 0

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }

0
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}

0

ฉันสร้างวิธีส่วนขยายเพื่อนำกลับมาใช้ใหม่

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

วิธีการโทร:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

ที่ไหนpositionที่ OP จะขอหา?
Si8

-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}

มันทำให้เกิดข้อผิดพลาด: 'System.Array' ไม่มีคำจำกัดความของ 'บรรจุ'
ePandit

-4

วิธีที่ง่ายและสั้นที่สุดจะเป็นดังต่อไปนี้

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

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