Bir dize dizisinin bir değer içerip içermediğini ve varsa konumunu alma


163

Bu dize dizisi var:

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

İçeriği stringArrayiçerip içermediğini belirlemek istiyorum value. Eğer öyleyse, dizideki konumunu bulmak istiyorum.

Döngüler kullanmak istemiyorum. Bunu nasıl yapabileceğimi kimse önerebilir mi?

Yanıtlar:


317

Array.IndexOf yöntemini kullanabilirsiniz :

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
... ve aylardır foreach kullanıyorum. BTW bu hesaplamaya göre BLUEPIXY'nin cevabından daha mı hızlı? Yoksa daha yavaş mı?
Max von Hippel

2
Büyük Array.IndexOfharf kullanımı önemser mi? Öyle "text1" == "TEXT1"mi?
EVIL

Array.IndexOf−1yalnızca dizin 0 sınırlıysa döner . Bu dava bozulur, bu yüzden unutmayın! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia

Tam eşleşme arıyorsanız bu yararlıdır. Bununla birlikte, durumla ilgilenmiyorsanız bu yararlı olabilir: Array.IndexOf'a büyük / küçük harfe duyarlı olmayan bir seçenek nasıl eklenir?
Kyle Champion

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

7
Array.FindIndex (dizi, x => x.StartsWith ("buraya dize girin") gibi daha karmaşık şeyler yapmak için bir lambdadan geçmesine izin verdiği için bu kabul edilen cevap olmalıdır:
reggaeguitar 21'de 14

1
Ama sorunun sorması bu değil. Soru, bir diziden bilinen bir değeri nasıl bulduğunuzu sorar.
Karl Gjertsen

2
@KarlGjertsen Dizi içindeki yerini bulmak istiyorum
BLUEPIXY

Bu, x.ToUpper () gibi bir şey yapabilmek benim için oldukça faydalı oldu.
mrshickadance

31

Ayrıca kullanabiliriz 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
Temiz ve basit cevap
Aryan Firouzian

Bireysel değerleri nasıl kontrol ederim? Bir karakter için bir char dizisini kontrol etmeye çalıştığımda, chardönüştürülemeyen bir mesaj aldımSystem.Predicate<char>
Aaron Franke

13

EDIT: Pozisyona da ihtiyacın olduğunu fark etmemiştim. IndexOfAçıkça uygulandığından, doğrudan bir dizi türünün değeri üzerinde kullanamazsınız . Ancak şunları kullanabilirsiniz:

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

(Bu çağırarak benzer Array.IndexOfDarin en Yanıt başına kadar -. Sadece alternatif bir yaklaşım O bana neden açık değil edilir aldırma dizilerde açıkça uygulanır, ama ...)IList<T>.IndexOf


Contains kullanarak dizideki dünyanın sahipliğini nasıl bulabilirim?
MoShe

Başka bir dize dizisi B'de A dize dizisindeki bir dize öğesini kontrol etme olasılığı var mı?
Murali Murugesan

@MuraliMurugesan: Ne sorduğunuz belli değil - iki dizinin ortak bir öğesi olup olmadığı ? Bir belirli madde? (İkinci durumda, bir dizide de olması önemsizdir.)
Jon Skeet

Burada cevap vermeye çalışıyordum stackoverflow.com/a/22812525/1559213 . Html.CheckBox satırı için true / false döndürmek için vurdu. Aslında bir ay dizisi ve birkaç ay var modeli var. Model ayı aylar dizisinde mevcutsa true değerini döndürmemiz gerekir. Roket yanıtı için teşekkürler :)
Murali Murugesan

@MuraliMurugesan: Kulağa hoş geliyorif (months.Contains(model.Month))
Jon Skeet

5

Kullanabilirsiniz Array.IndexOf()- öğe bulunamazsa -1 değerini döndürür ve bu durumu ele almanız gerekir.

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

4

bu şekilde deneyebilirsiniz ... Array.IndexOf () kullanabilirsiniz, eğer pozisyonu da bilmek istiyorsanız

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

3

IMO, bir dizinin belirli bir değer içerip içermediğini kontrol etmenin en iyi yolu System.Collections.Generic.IList<T>.Contains(T item)yöntemi şu şekilde kullanmaktır:

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

Tam kod örneği:

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[]diziler List<T>Kont ve İçer gibi birkaç yöntemi özel olarak uygular . Açık (özel) bir uygulama olduğu için, önce diziyi yayınlamadan bu yöntemleri kullanamazsınız. Bu yalnızca dizeler için geçerli değildir - öğenin sınıfı IComparable uyguladığı sürece, herhangi bir tür dizinin herhangi bir öğe içerip içermediğini kontrol etmek için bu hileyi kullanabilirsiniz.

Tüm IList<T>yöntemlerin bu şekilde çalışmadığını unutmayın . IList<T>Bir dizide 'Add' yöntemini kullanmaya çalışmak başarısız olur.


2
Seninki temelde Priyank ile aynı cevap. OP'nin istediği öğenin dizinini vermez.
reggaeguitar

@reggaeguitar Orada seninle aynı fikirde!
Si8

Bu çözüm Ben tamamen soruya cevap vermez rağmen arıyordu.
Auspex

1

Bunu deneyebilirsiniz, bu öğeyi içeren dizini arar ve dizin numarasını int olarak ayarlar, sonra int'in -1'den büyük olup olmadığını kontrol eder, bu yüzden 0 veya daha fazla ise, bir dizin - diziler 0 tabanlıdır.

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

Yeniden kullanım için bir uzantı yöntemi oluşturdum.

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

        return false;
    }

Nasıl aranır:

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

Nerede olduğunu positiono OP istiyor?
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.
}

Hata verir: 'System.Array', 'içerir' için bir tanım içermiyor.
ePandit

-4

En basit ve daha kısa yöntem şöyledir.

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

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

3
Soru, bir dizideki bir öğenin konumunu bulmakla ilgiliydi .... ContainsYöntemle, bu bilgilere sahip değilsiniz
Bidou
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.