Dizge dizide mi?


107

string[]Bir öğe içerip içermediğini görmek için a'ya bakmanın en iyi yolu nedir ? Bu benim ona ilk şansımdı. Ama belki de gözden kaçırdığım bir şey vardır. Dizi boyutu 200 öğeden büyük olmayacaktır.

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}

Yanıtlar:


210

Zaten yerleşik olan Contains () yöntemini kullanmanız yeterlidir:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

Nedense yöntemi ilk aradığımda bulamadım ... teşekkürler.
Brad

4
@Brad: Bunun nedeni, Enumerable'dan gelen bir genişletme yöntemi.
AnthonyWJones

8
Tek astar olarak:(new string[] { "foo", "bar" }).Contains("foo")
Denis V

8
Daha da kısa:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot 01

25

Bunun eski olduğunu biliyorum, ancak yeni okuyucuların bunu jenerik ve genişletme yöntemlerini kullanarak yapmak için yeni bir yöntem olduğunu bilmesini istedim.

Bunun nasıl yapılacağı hakkında daha fazla bilgi görmek için blog yazımı okuyabilirsiniz , ancak ana fikir şudur:

Bu uzantı yöntemini kodunuza ekleyerek:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

aramanızı şu şekilde yapabilirsiniz:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

Her tür üzerinde çalışır (iyi bir eşittir yöntemi oluşturduğunuz sürece). Kesinlikle herhangi bir değer türü.


Buna benzer bir şeyim var var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");, yapmak istediğim şey , değerlerin aşağıdaki dizelerden herhangi birinde bitip bitmediğini görmek için ilk sütundaki who datatable'a bakmaktır .. eğer yoksa, o zaman şunu belirten bir dize döndürmek istiyorum .00Örneğin, örneğinizi kullanırken bir değer eksik gibi görünüyor, bunun çalışmasını sağlayamıyorum, bu biraz daha yanıltıcı çünkü bir bool döndürmek istemiyorum, yönteminizi bir dizge döndürmek için değiştirdim ama yine de herhangi bir öneri çalışmıyor
MethodMan

Bu, sitede bir soru olarak sorulması daha iyi görünüyor. Devam edin ve gerekirse bu yanıtı referans alın.
Gabriel McAdams

Aslında yapmak istediğim şeyi yapmanın harika bir yolunu bulabildim. Datatables ItemArray için bir for döngüsünün içindeki bir dizenin değerlerinin aşağıdaki değerlerden herhangi biriyle bitip bitmediğini kontrol edecek bir şey yazdım. string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan

12

Array.Exists işlevinin (veya .NET 3.5 kullanıyorsanız, biraz daha kullanışlı olan uzantı İçerir yönteminin) peşindesiniz.


3
İşte .NET 2.0 için çalışan bir örnek: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
Fueled

7

Linq (s & g'ler için):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

veya gereksinimlere bağlı olarak

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));


2

Diziler, genel olarak, belirli bir nesnenin koleksiyonda olup olmadığını sormak istiyorsanız kullanmak için zayıf bir veri yapısıdır.

Bu aramayı sık sık çalıştıracaksanız, Dictionary<string, something>bir dizi yerine bir kullanmak buna değer olabilir . Bir Sözlük'teki aramalar O (1) (sabit zaman), dizi içinde arama ise O (N) (dizinin uzunluğu ile orantılı zaman alır).

Dizi en fazla 200 öğe olsa bile, bu aramaların çoğunu yaparsanız, Sözlük muhtemelen daha hızlı olacaktır.


1
ikili arama O (log n); sözlük O (1) 'e tabidir - ancak çok fazla ek yük vardır; küçük ve orta büyüklükte, doğrusal arama veya ikili arama için daha iyi performans gösterebilir.
Marc Gravell

1

Dizi üzerinde yineleme yapmak için LINQ da kullanabilirsiniz. veya bir delegenin onu aramasını sağlayan Bul yöntemini kullanabilirsiniz. Bununla birlikte, bul yönteminin sadece döngüden biraz daha pahalı olduğunu düşünüyorum.


Find yöntemi, algoritmik olarak "döngüleme" yöntemiyle aynı olacaktır. Herhangi bir ekstra masraf, bir miktar nesne oluşturma ve belki bir veya iki dolaylı yönlendirme katmanı olacaktır, ancak bunları okunabilirlik pahasına optimize etme konusunda endişeleniyorsanız, yanlış şeyler için endişeleniyorsunuzdur.
AwesomeTown

1

Yukarıdaki başlıkta birçok kez bahsedildiği gibi, kullanımdaki çerçeveye bağlıdır. .Net Framework 3 ve üzeri, diziler için .Contains () veya Exists () yöntemlerine sahiptir. Aşağıdaki diğer çerçeveler için, dizide döngü yapmak yerine aşağıdaki numarayı yapabilirsiniz ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

Verimlilik konusunda çok emin değilim ... Dave


0

Bu, dizi boyunca manuel olarak yinelemekten daha hızlıdır:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

LINQ kullanmak, örnekte yapıldığı gibi dizeyi yinelemekten daha hızlıdır. strArray.Contains (key) gerçekten gerekli olan tek şey
Chris Ballance

3
Perde arkasında strArray.Contains (key) her halükarda dizide dönecek ... Sizi bir O (n) araması yapmaktan kurtaracak hiçbir sihir yoktur.
AwesomeTown

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.