массив строк. Содержит? - PullRequest
       43

массив строк. Содержит?

19 голосов
/ 12 октября 2010

.NET 2

string[] myStrings = GetMyStrings();    
string test = "testValue";

Как я могу проверить, содержит ли myStrings test?

Ответы [ 10 ]

18 голосов
/ 12 октября 2010

В .NET 2.0 вы могли бы сделать следующее, если хотите индекс:

int index = Array.FindIndex(
    myStrings,
    delegate(string s) { return s.Equals(test); }
);

index будет -1, если myStrings не содержит test.

Если вы просто хотите проверить существование:

bool exists = Array.Exists(
    myStrings,
    delegate(string s) { return s.Equals(test); }
);
11 голосов
/ 01 июля 2011

Я нашел элегантный ответ на странице здесь http://www.dotnettoad.com/index.php?/archives/10-Array.Contains.html. Что вам нужно сделать в .NET 2.0, это привести к IList и вызвать метод Contains.

(IList<string> mystrings).Contains(test);
10 голосов
/ 12 октября 2010

Вот подход, совместимый с .NET 2.0. Использование Array.Find вернет ноль, если значение не найдено.

C # Подход

string[] myStrings = { "A", "B", "testValue" };
string test = "testValue";
string result = Array.Find(myStrings, delegate(string s) { return s == test; });
Console.WriteLine("Result: " + result);

Если вам нужно совпадение без учета регистра, используйте s.Equals(test, StringComparison.InvariantCultureIgnoreCase).

РЕДАКТИРОВАТЬ: с VB.NET 2.0 требуется больше усилий, поскольку он не поддерживает анонимных делегатов. Вместо этого вам нужно будет добавить Function и использовать AddressOf, чтобы указать на него. Вам необходимо установить testValue в качестве члена или свойства, поскольку он не будет передан в метод предиката. В следующем примере я использую Array.Exists.

Подход VB.NET

' field or property ' 
Dim test As String = "testValue"

Sub Main
    Dim myStrings As String() = { "A", "B", "testValue" }       
    Dim result As Boolean = Array.Exists(myStrings, AddressOf ContainsValue)
    Console.WriteLine(result)
End Sub

' Predicate method '
Private Function ContainsValue(s As String) As Boolean
    Return s = test
End Function
9 голосов
/ 12 октября 2010

Вместо использования статического массива вы можете использовать список:

List<string> myStrings = new List<string>(GetMyStrings());
if(myStrings.Contains("testValue"))
{
    // Do Work
}
7 голосов
/ 14 октября 2013

Думаю, я бы добавил еще один к миксу, сначала доступный в .NET 3.5, я думаю:

Enumerable.Contains(myStrings.ToArray(), test)
2 голосов
/ 12 октября 2010
bool ContainsString(string[] arr, string testval)
{
    if ( arr == null )
        return false;
    for ( int i = arr.Length-1; i >= 0; i-- )
        if ( arr[i] == testval )
            return true;
    return false;
}

И это будет лучшая производительность в мире.: P

1 голос
/ 12 октября 2010

вы можете использовать Array.BinarySearch, как описано ниже.

 string[] strArray = GetStringArray();
        string strToSearch ="test";
        Array.BinarySearch(strArray, strToSearch);
1 голос
/ 12 октября 2010

Вот почти тот же вопрос на MSDN. Найти строку в массиве строк Как уже говорили другие, у вас действительно есть два варианта: 1) Использовать список для более легкой проверки 2) Прокручивать массив, чтобы найти строку

0 голосов
/ 12 октября 2010

Как насчет этого:

Sub Main
    Dim myStrings(4) As String
    myStrings(0) = "String 1"
    myStrings(1) = "String 2"
    myStrings(2) = "testValue"
    myStrings(3) = "String 3"
    myStrings(4) = "String 4"

    Dim test As String = "testValue"

    Dim isFound As Boolean = Array.IndexOf(myStrings, test) >= 0

    If isFound Then
        Console.WriteLine("Found it!")
    End If
End Sub

Это должно работать для .Net 2.0 и VB.Net.

0 голосов
/ 12 октября 2010

Я предполагаю, что вы хотите проверить, содержит ли какой-либо элемент в вашем массиве определенное значение (test) Если это так, вы хотите построить простой цикл. На самом деле я думаю, что вы должны нажать здесь .

...